由于最大执行时间致命错误,PHP cron作业提前终止

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配置设置有关,因为:

  1. 我知道它运行了29:18分钟(即错误信息超过60秒).
  2. PHP文档 - 从命令行运行PHP时,默认设置为0.

问:为什么脚本会提前终止?


笔记:

该脚本非常繁重,并且运行了数千个数据库查询,但我正在运行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调用,这些调用不会占用执行时间.

Mik*_*nen 1

如果您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.