我有一个PHP cron作业,在运行29分钟后失败。日志(/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
触发cron的crontab条目是:
00 00 * * * /usr/bin/php /path/file.php
根据我的研究,我不认为这与max_execution_time
配置设置有关,因为:
问:为什么脚本会提前终止?
注意:
脚本非常繁重,并且运行了数千个数据库查询,但我运行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可以将引用执行时间降低得多。
在确定脚本运行的最长时间时,不会包括在执行脚本之外发生的任何活动,例如使用system()的系统调用,流操作,数据库查询等。
(来自the set_time_limit() docs,但也在the max-execution-time docs中提及)。这对我来说很重要,因为大多数脚本都是长时间运行的数据库查询和支付API调用,这些调用不会占用执行时间。
答案 0 :(得分:2)
好吧,你可以设置一个更大的时间限制值,或者你可以使用set-time-limit()设置它无限制:
<?php set_time_limit(0); ?>
但实际上我也是在脚本开头使用它
ignore_user_abort(1);
答案 1 :(得分:1)
不幸的是我不能写评论,所以我的问题就是,如果你手动运行会怎么样?它还会超时吗?
如果手动运行它没有超时,我建议你调用一个小shell脚本,它实际上运行一个shell并在shell中运行“/ usr / bin / php /path/file.php”
<00> 00 00 * * * /usr/local/scripts/start_php_job.shFile: /usr/local/scripts/start_php_job.sh
#!/usr/bin/bash
date
/usr/local/bin/php /path/to/script
date
答案 2 :(得分: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
中定义。