2012-08-15 152 views
1

我目前有一個網站已被我的託管服務提供商兩次暫停「過度使用系統資源」。在每種情況下,我的一個PHP腳本在服務器上剩下300-400個拷貝。PHP腳本崩潰和最大執行時間

腳本本身從家裏的網絡攝像頭拉出圖像並將其複製到服務器。他們利用文件鎖來確保一次只能寫入一個文件。任何查看頁面的客戶端都會每3秒調用一次腳本。

最初我很困惑,因爲我已經理解PHP腳本完成(返回結果)或崩潰(返回內部服務器錯誤頁面)。然而,我知道「已停用的腳本」是非常普遍的現象。

任何人都可以教育我嗎?我已經谷歌搜索到死亡,但我看不到腳本可以在崩潰的狀態下結束。當它達到最大執行時間時會不會超時?

我的託管服務提供商在Linux平臺上將PHP設置爲CGI。我相信我實際上已經發現我的腳本存在這個問題,因爲我沒有意識到這個羣是一個阻塞函數(並且我沒有使用LOCK_NB掩碼)。我假設以某種方式,我的腳本的數百個副本最終阻止等待資源變得可用,並導致崩潰?這聽起來似乎合理嗎?我不願意重新啓用該網站,以免再次被暫停。

任何見解非常感謝。

+0

我看不出爲什麼你需要一個文件鎖定 - 或者更重要的是,爲什麼多個運行腳本需要寫入同一個文件。這聽起來像你可能在setInterval()方法上調用ajax,而應該在前一個ajax調用的成功處理程序中調用'setTimeout()'。如果你是'flock()'文件,確保你在完成之後立即記住'LOCK_UN',並且記住如果你正在讀它,你不需要'LOCK_EX','LOCK_SH '就足夠了。 – DaveRandom 2012-08-15 12:12:01

+0

這聽起來像是實際提供商的問題;他們是否使用Apache/suPHP? – 2012-08-15 12:23:40

+0

@Jack起初,我認爲這實際上可以通過mod_php來看到(剛剛測試過) - 因爲'flock()'會阻塞,當你在* nix上運行時,如果腳本從不到達鎖定隊列的頂部。這是非常愚蠢的,但顯然是這樣。在['set_time_limit()'手冊頁](http://php.net/manual/en/function.set-time-limit.php)上也有關於此的說明。 – DaveRandom 2012-08-15 12:28:43

回答

0

腳本可能崩潰的這兩個限制

  • 的max_execution_time
  • memory_limit的

與資源工作時,除非你有腳本沒有其他錯誤/檢查通知的錯誤太

1

可能我建議的方法是首先使用tempnam(),然後寫入內容(可能需要一段時間)。一旦完成,你做文件鎖定等。

不知道當PUT請求正在完成時是否發生這種情況;通常PHP會在將執行交給腳本之前處理文件上傳。

+0

謝謝傑克。要重寫我的腳本,結合Dave的上述建議,嘗試一下。對不起,我是一個新用戶,無法投票,但無論如何表示讚賞。 – Lewis 2012-08-15 15:30:05