我有一个CronJob计划每7分钟运行一次。该脚本在许多用户上运行循环,并通过SMTP发送电子邮件或通过curl进行一些API调用。
因此,大多数执行时间显然是在Linux上由max_execution_time
跟踪的领域之外。所以,因为我在我的脚本中遇到了挂起,它总是通过重新启动来修复(我也在寻找挂起的原因,但到目前为止还没有成功)。
因为set_time_limit设置为6分钟,脚本有时会运行30分钟,我现在在循环中的每一轮之后检查microtime(true)
并且如果运行时间超过6分钟就会中断。{ / p>
尽管如此,该脚本有时会运行37分钟(即使我可以看到电子邮件,它在一个循环中映射到一个圆形,仍然会消失)。
我留下的唯一技巧是pcntl_fork
。由于平台依赖性,我不愿意使用它,因为我认为使用循环并且microtime(true)
应该跟踪在流程外部花费的时间,我想了解为什么在这里不是这种情况。
答案 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']);
}