在php中继续超时脚本的最佳方法


Best way to continue a timed out script in php?

我编写了一个php文件,用于检查某些文件夹中的新文件,然后通过电子邮件发送上次运行以来的最新文件。有时这可能是一封电子邮件附带的10-15个文件。我用swiftmailer发送邮件。

这个脚本可以循环多达50个客户,每个客户可以有需要通过电子邮件发送的文件。通常情况下,这将通过PHP超时并抛出错误。我一直试图通过php将客户号码写入文件来跟踪它离开的地方。

我如何使用PHP说"如果有一个突然退出或错误,然后重新运行这个文件。"

另一种说法是....当我得到超时错误或任何其他错误时,我可以简单地重新加载另一个PHP文件以继续我离开的地方吗?

这似乎不是最干净的方式来完成我的任务,所以我愿意听取建议。

您可以通过写入平面文件或数据库来跟踪要处理的文件,并在每个文件完成时删除其条目。当脚本重新启动时,读取要处理的文件列表,并从停止的地方继续。

另外,如果你知道你的脚本经常需要更多的时间,考虑增加php.ini中的超时设置。

如果需要不断重新启动脚本,直到处理完成,请考虑以下场景:

  • 每隔五分钟(或适当的间隔)通过cron启动脚本
  • 脚本写一个PID文件
    • 如果脚本发现PID文件已经存在,那么之前的脚本崩溃了,所以重新开始处理日志。
  • 检查数据库是否上次成功运行。
    • 如果最后一次成功运行时间小于最小值(当前运行脚本的时间间隔),则删除PID并退出。
    • 如果上次成功运行时间超过最小值,则处理文件,删除PID并退出。

使用PID文件并不是必须的;您可以通过检查日志是否存在和是否有条目来获得相同的信息。然而,PID的使用是传统的,它提供了一种快速而廉价的方法来确定前一个进程是否成功完成。