我每小时运行一次 cron 作业,可以启动多个“作业”来完成。
cron 作业指向一个 php 文件,该文件启动一个“后台脚本”,必要时重复多次。
完成每个“工作”的时间可能会花费未知的时间,但总是在不到 20 分钟的时间内完成。因此,服务器“max_execution_time”设置为允许脚本运行 20 分钟以防止超时。
如果脚本有 4 个作业,每个作业需要 10 分钟,则总执行时间将超过 20 分钟。
我对如何解决这个问题的想法是在一个“工作”完成后使用 header("Location: $url") 来为“下一个工作”启动脚本的新重启并获得 20 分钟的新工作时间。
只要“工作”只需要几分钟,一切都很好。但是当它到达一个需要 12 分钟的“工作”时。标头(“位置:$ url”)失败并出现500 内部服务器错误
, 随后:
此外,在尝试使用 ErrorDocument 处理请求时遇到了 500 内部服务器错误错误。
即使包括以前的“作业”在内的总执行时间少于 20 分钟,也会发生这种情况。
我不超过 cron 作业重定向,也不超过 20 分钟的执行时间(包括所有当前的“作业”)。
所以即使我想使用 header("Location: $url") 来防止未来的总执行时间超过 20 分钟。
当前失败的是 6 个“作业”,前 4 个的总执行时间为 2.5 分钟。第 5 项工作是 12 分钟。位置重定向到最后 6:th 作业不起作用,因为 header("Location: $url") 在第 5:th 作业运行 12 分钟后失败。到此为止,所有“作业”的总执行时间仅为 14.5 分钟,重定向为 5(允许重定向为 60)。
如果我将 12 分钟的作业切换到其他 6 个较短的运行作业,总共有 10 个较短的作业,一切正常。
所以似乎与脚本的运行时间以及 header("Location:") 如何工作有关?
我知道这个解决方案不是处理这类任务的最佳(或任何好的)方法。但是在开发过程中这条路将我带到了这一点,并在我重写一个新的“工作”处理程序时找出为什么会发生 500 内部错误将使这个解决方案工作。
因此,欢迎任何帮助:)
if ($job != "available") { // this illustrates a check in database if there is any jobs "available" or if all is finished
return "all jobs finished";
}
$repeating = true;
while ( $repeating == true ) {
// has different stuff that can take some time to finish
if($something == true) {
// run task
continue;
}
if($something_else == true) {
// run task
continue;
}
// above currently takes between 1 to 12 minutes
// when finished set $repeating to false to end while loop
$repeating = false;
}
注意:我创建了一个自定义的 500 错误页面,该页面将我指向标题(“位置”)作为问题,因为它为我提供了有关所请求内容的以下信息:
请求的 URL:“实际重新加载的 $url 出现在此处”
重定向状态码:500
值得一提。该错误还表示:
此外,在尝试使用 ErrorDocument 处理请求时遇到了 500 Internal Server Error 错误。
所以目前没有可用的错误日志
交互式爱情
人到中年有点甜