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

时间:2013-05-08 19:43:15

标签: php

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

此脚本最多可循环50个客户,每个客户都可以拥有需要通过电子邮件发送的文件。通常,这将通过PHP超时并抛出错误。我一直试图通过php将客户编号写入文件来追踪它停止的位置。

如何使用PHP说“如果出现突然退出或错误,请重新运行此文件。”

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

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

1 个答案:

答案 0 :(得分:3)

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

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

如果您需要不断重启脚本直到处理完成,请考虑以下情形:

  • 每隔五分钟(或适当的间隔)通过cron启动脚本
  • 脚本写入PID文件
    • 如果脚本发现PID文件已存在,则前一个脚本崩溃,因此再次开始处理日志。
  • 检查数据库中上次成功运行时间。
    • 如果上次成功运行时间小于最小值(当前运行脚本的时间间隔),请删除PID并退出。
    • 如果上次成功运行时间超过最小值,请处理文件,删除PID并退出。

使用PID文件并非绝对必要;您可以通过检查日志是否存在并具有条目来获取相同的信息。但是,PID的使用是传统的,并且提供了一种快速且廉价的方法来确定先前的过程是否成功完成。