我正在尝试追踪看似非常奇怪的错误。我的应用程序结构大致如下:
set_time_limit(0);
register_shutdown_function('logScriptCompletion');
function logScriptCompletion() {
log('script completed');
}
log('script started');
// do some calculations periodically printing out progress
脚本可能需要一段时间才能运行。所需的行为是脚本继续计算到最后,即使按下停止按钮或连接被删除。 99%的时间按预期工作。
偶尔(可能每隔几个月/几千次请求)计算不会一直运行但是“脚本已启动”和“脚本已完成”都会被记录,并且没有其他错误致命或其他明显的错误(我已启用完整日志记录)。
我怀疑这可能与服务器的连接被删除有关,但没有确凿的确凿证据。我在Linux上运行Apache 2 / PHP 5.2.6。
有没有其他人看到类似的问题,可以帮助解释一下这个问题?
答案 0 :(得分:9)
绝对!您还应该使用ignore_user_abort()
function 来确保。
答案 1 :(得分:4)
作为一个想法,我有时认为使用来自定期安排的cron作业的命令行版本的php执行此类脚本更好。 (否则,如果httpd由于某种原因重新启动,处理将终止,等等)
因此,您将使用该网站记录您需要运行后台处理作业(例如,在数据库表中)并上载要处理的任何数据。然后,执行PHP脚本的cron将检查数据库中的任何挂起作业,一旦开始执行就将作业标记为正在进行,然后更新数据库表中的“百分比完成”字段,该网站可以读取该字段 - 因此告知用户进度。
当处理完成后,PHP会相应地更新数据库,将作业标记为已处理,并在需要时通过电子邮件发送给用户,等等。
注意:您可以通过为处理的开始和结束添加一些基本的日期时间字段来有用地扩展此方法,从而提供一种简单检查以查看是否存在长时间运行的作业的方法,等等。