我有一个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