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

时间:2012-03-01 07:45:02

标签: php cron fatal-error

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

  1. 我知道它的运行时间为29:18分钟(例如错误信息的60多分钟)。
  2. From the PHP docs - 从命令行运行PHP时,默认设置为0.
  3. 问:为什么脚本会提前终止?


    注意:

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

3 个答案:

答案 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.sh

File: /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中定义。