【问题标题】:PHP Cron job execution time limits failPHP Cron 作业执行时间限制失败
【发布时间】:2014-06-21 00:25:47
【问题描述】:

我有一个 CronJob 计划每 7 分钟运行一次。该脚本在多个用户上运行一个循环,并通过 SMTP 发送电子邮件或通过 curl 进行一些 API 调用。

因此,大部分执行时间显然花费在 Linux 上 max_execution_time 跟踪的领域之外。所以,因为我的脚本遇到挂起,总是通过重新启动它来修复(我也在寻找挂起的原因,但到目前为止还没有成功)。

因为 set_time_limit 设置为 6 分钟,脚本有时仍会运行 30 分钟,我现在在循环中的每一轮后检查 microtime(true),如果它已运行超过 6 分钟,则退出它。

不过,脚本有时会运行 37 分钟(尽管我可以看到循环映射到一轮的电子邮件仍然会消失)。

我剩下的唯一技巧是pcntl_fork。由于平台依赖性,我不愿意使用它,因为我认为使用循环和microtime(true) 也应该跟踪在进程之外花费的时间,我想了解为什么这里不是这种情况。

【问题讨论】:

    标签: php curl cron timeout


    【解决方案1】:

    max_execution_time 用于限制脚本执行时间。但是,这不会影响系统调用。请参阅manpage

    您还可以使用set_time_limit() 正确设置脚本可以运行的最长时间。这只会更改范围内脚本的 time_limit。你也试过了吗?

    您可以在this link 找到另一个可能对您有所帮助的问题。

    【讨论】:

    • 谢谢,我知道在 Linux 上不跟踪系统调用,我也使用 set_time_limit,我试图在我的问题中传达这些事实。感谢您提供指向另一个问题的链接,也许我应该考虑使用适当的守护进程,但这仍然会让我没有工作工具来捕捉错误的长时间运行的例程。
    【解决方案2】:

    我最终离开了 PHP 来获得时间,这很简单,有效,并且不需要我学习处理 pcntl 函数。

    $time_comp = microtime(true); // save start time
    function check_time_against_mysql($dbh,$time_comp) // run this function
    {                                                  // to see how much time passed
        $time = $dbh->prepare("SELECT UNIX_TIMESTAMP() - :created AS time_in_seconds");
        $time->bindValue(":created",$time_comp);
        $time->execute() or die("fail time");
        $time_passed = $time->fetch(PDO::FETCH_ASSOC);
        return floatval($time_passed['time_in_seconds']);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 2013-08-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-21
      • 2016-06-04
      相关资源
      最近更新 更多