Tom*_*Tom 5 php cron fatal-error
我有一个PHP cron作业,运行29分钟后失败.log(/var/log/php_errors.log)中的错误是:
[01-Mar-2012 00:32:57 UTC] PHP Fatal error: Maximum execution time of 60 seconds exceeded in /path/file.php on line 2079
Run Code Online (Sandbox Code Playgroud)
触发cron的crontab条目是:
00 00 * * * /usr/bin/php /path/file.php
Run Code Online (Sandbox Code Playgroud)
从我的研究中我不认为这与max_execution_time配置设置有关,因为:
问:为什么脚本会提前终止?
笔记:
该脚本非常繁重,并且运行了数千个数据库查询,但我正在运行top并且CPU负载不高.
错误日志中的行是一个mysql_query调用:
$sql = "SELECT SUM(amount) FROM mytab WHERE mem = '$id' AND validto > '$now'";
$res = mysql_query($sql);
Run Code Online (Sandbox Code Playgroud)
> 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)
Run Code Online (Sandbox Code Playgroud)
更新 - 我发现为什么脚本可以运行29分钟的实时,但PHP可以退出引用执行时间低得多.
在确定脚本运行的最长时间时,不会包括在执行脚本之外发生的任何活动,例如使用system()的系统调用,流操作,数据库查询等.
(来自set_time_limit()文档,但也在max-execution-time docs中提到).这对我来说很重要,因为大多数脚本都是长时间运行的数据库查询和支付API调用,这些调用不会占用执行时间.
如果您PHP Fatal error: Maximum execution time of 60 seconds exceeded确定某个正在运行的 PHP 代码set_time_limit(60)在某处运行了语句。PHP CLI 模式可能默认没有时间限制,但如果任何代码路径设置了时间限制,它将受到尊重。PHP 确实运行了接近半小时的原因是因为set_time_limit设置了 CPU 时间限制,如果进程受到 I/O 限制或等待其他进程,那么在实时时钟中,总 CPU 使用率将在很晚的时候达到 60 秒大关。
尝试在所有源代码中搜索set_time_limit. 如果您没有找到任何内容,请set_time_limit(0)在脚本开头添加,以确保 60 秒限制不是来自本地修改的配置文件。例如,在 Ubuntu LTS 上,PHP CLI 配置在/etc/php5/cli/php.ini.