PHP Cron作业执行时间限制失败

时间:2014-05-04 18:30:16

标签: php curl cron timeout

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

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

因为set_time_limit设置为6分钟,脚本有时会运行30分钟,我现在在循环中的每一轮之后检查microtime(true)并且如果运行时间超过6分钟就会中断。{ / p>

尽管如此,该脚本有时会运行37分钟(即使我可以看到电子邮件,它在一个循环中映射到一个圆形,仍然会消失)。

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

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

我最终走出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']);
}