2012-03-18 91 views
7

我有一個PHP腳本,它需要至少1000秒的執行時間才能完成。PHP腳本在沒有錯誤的情況下超時結束

每次大約265秒後終止,沒有錯誤。由於我正在使用循環,因此我測試了迭代次數,並且與循環次數無關,進一步排除了循環中出現錯誤的可能性。

我已經在php.ini中將max_execution_time設置爲10800,並且還更改memory_limit不會影響結果。

請幫忙!我徹底撓了撓頭!

+1

你的代碼是做什麼的?你確定沒有錯誤嗎?您是否將錯誤顯示設置爲E_ALL?你有沒有用'@'操作符來抑制任何錯誤? – 2012-03-18 18:11:16

+0

確保它不會引發錯誤。你看過日誌文件嗎? – Neysor 2012-03-18 18:13:12

+1

你是從命令行,cron作業,web服務器等運行的嗎?你有沒有嘗試過一種不同的調用方法? – dldnh 2012-03-18 18:13:57

回答

0

你檢查了你的日誌文件嗎?如果您收到錯誤6或分段錯誤。然後你的腳本實際上是崩潰的PHP,而不會在瀏覽器上顯示任何錯誤(如果它是瀏覽器而不是cli)。

如果您在unix上使用apache,那麼您應該在/var/log/apache2/error.log中找到此日誌。

否則,可以通過加入這一行定義日誌文件的路徑.htaccess

php_value error_log "/path/to/somewhere/convenient/php_errors.log" 

更改路徑的地方在那裏你的httpd具有寫權限,並在那裏你讀取權限。

+1

這個新的錯誤日誌是空白的嗎 – 7HUND3RX 2012-03-18 20:16:13

+0

嗯是的我猜想分段錯誤將保留在HTTP服務器日誌文件中。由於PHP已經崩潰。你有沒有試過尋找Apache的錯誤日誌?或您使用的是哪個HTTP服務器? – 2012-03-18 21:59:17

+1

服務器日誌文件在我獲得的Plesk上不被允許。託管服務提供商確認這是由於單個腳本允許使用的最大資源限制。 非常感謝您的時間和幫助! – 7HUND3RX 2012-03-19 14:13:07

0

得出:

set_time_limit(0); 
在腳本的開頭

。以便代碼執行不會超時,除非完成。

+0

我想他說他已經排除了暫停。 – 2012-03-18 18:24:21

+0

沒有幫助..它是無法貫穿整個10800s的時間.. – 7HUND3RX 2012-03-18 20:25:59

+0

@AshishAgrawal顯示您的代碼有問題。 – mithunsatheesh 2012-03-19 03:44:24

0

這同樣的錯誤發生在我身上。我的一個PHP函數在沒有任何錯誤發送到stderr,stdout或任何其他日誌文件的情況下死亡。

發生了什麼是我正在使用由其他開發人員編寫的助手PHP腳本,該腳本將內存限制設置爲通過我的程序操作的一半的512MB內存。在處理我的腳本的過程中,通過將錯誤日誌設置設置爲無聲,子模塊中毒了該井。

通過在循環的每次迭代中打印出可用於PHP腳本的php系統設置,可以證明這是否發生在您身上。當下標執行髒操作時,PHP引擎在垃圾收集器將來運行在隨機點後拋出適配器,然後立即死亡而沒有錯誤。這是PHP垃圾收集器中的一個錯誤,當垃圾收集器正在完成其工作時,子模塊會混淆系統設置。

解決方案:編輯php helper子模塊,並確保它們不會調整系統設置,因爲垃圾回收器正在完成其工作。在PHP系統變量中毒之後,PHP解釋器會出錯並死掉,沒有任何錯誤或以隨機間隔輸出。

0

在PHP,以隱藏即使display_errorserror_reporting正確指出記錄錯誤的唯一方法是使用Error Control Operators

例如:下面的代碼將引發一個致命錯誤,但一個「隱藏」一,它不會出現在日誌或瀏覽器上。

@echo "forgetting the last quote; 

所以的display_errors值設置爲開,您正在使用依賴於PHP版本的error_reporting(見差異here),並檢查是否使用的是在你的代碼中的「@」符號。