我每小时运行一次 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 错误。所以目前没有可用的错误日志
2 回答
交互式爱情
TA贡献1712条经验 获得超3个赞
我怀疑您收到的错误 500 实际上与脚本发现其环境与预期不同有关。
例如,某些会话或数据库连接已过期。
我建议您设置error_reporting
为最大值并为错误级别(包括启动错误)添加合适的日志记录。
在不详细了解这些工作的作用以及它们如何工作的情况下,不可能猜出错误的确切原因。正如您的自定义处理程序所展示的那样,重定向有效。问题是新的脚本实例失败了。
另一种可能性是重定向到一个诊断脚本,该脚本只是将 等的内容转储到文件$_SERVER
中$_SESSION
。然后,开始将作业管理器脚本的内容添加到诊断脚本中,直到它再次中断并出现 500 错误。
人到中年有点甜
TA贡献1895条经验 获得超7个赞
首先,您应该检查错误日志以获取确切的错误消息。如果没有确切的信息,我们无法提供详细的答案。另外如何将最后一个作业存储在某个地方(文本文件/数据库),以继续下一个作业。
例如:
<?php
$id_job = 0;
switch($id_job)
{
case 10:
job1();
case 20:
job2();
}
在每个作业之后,只需设置当前/完成作业的 id_job 并在输入开关/案例之前添加 10。
- 2 回答
- 0 关注
- 192 浏览
添加回答
举报
0/150
提交
取消