我有一個PHP cron作業運行29分鐘後失敗。在日誌中的錯誤(/var/log/php_errors.log
)是:PHP cron作業由於最大執行時間提前終止致命錯誤
[01-Mar-2012 00:32:57 UTC] PHP Fatal error: Maximum execution time of 60 seconds exceeded in /path/file.php on line 2079
觸發的cron crontab條目是:
00 00 * * * /usr/bin/php /path/file.php
從我的研究,我不認爲這是關係到max_execution_time
配置設置,因爲:
- 我知道一個事實,它運行了29:18分鐘(即比錯誤消息多得多於60秒)。
- 從the PHP docs - 當在命令行運行PHP的默認設置爲0
問:爲什麼腳本早終止?
注:
劇本是非常沉重的,而且會運行成千上萬的數據庫查詢,但我跑top
和CPU負荷率不高。
從錯誤日誌中的線是mysql_query
電話:
$sql = "SELECT SUM(amount) FROM mytab WHERE mem = '$id' AND validto > '$now'";
$res = mysql_query($sql);
> php -v
PHP 5.3.10 (cli) (built: Feb 2 2012 17:34:38)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH
> cat /etc/redhat-release
Red Hat Enterprise Linux Server release 5.7 (Tikanga)
更新 - 我找到了原因腳本可以29分鐘的實時運行,但PHP可以退出引用執行時間低得多。
在任何時間用在這種情況發生的腳本的執行,例如系統調用使用系統(),流操作,數據庫查詢,等等確定該腳本已運行的最大時間時,不包含外活性。
(來自the set_time_limit() docs,但也在the max-execution-time docs中提及)。這對我來說很重要,因爲大部分腳本都是長時間運行的db查詢和支付API調用,而這些調用不會爲執行時間計時。
cron作業與您的錯誤無關,這是一個純粹的PHP問題。檢查內存泄漏,嘗試在執行循環後取消設置一些錯誤數組。在查詢之間設置免費的其他大變量。 – 2012-03-01 07:54:43
您還會在文檔中注意到:_最大執行時間不受系統調用,流操作等的影響。你能確定它實際上是由cron激發的PHP _CLI_嗎? – 2012-03-01 07:57:10
我也會檢查你是否有合適的索引來加速選擇。你有*** ***和***有效***指數? – 2012-03-01 08:14:29