我想基于某些表单输入运行一个相对耗时的脚本,但我宁愿不诉诸cron,所以我想知道通过ajax请求的php页面是否会继续执行直到完成或者它是否会如果用户离开页面则停止。
在文件末尾的json_encode之前它实际上并没有输出到浏览器,那么之前的所有内容是否仍会执行?
答案 0 :(得分:72)
取决于。
来自http://us3.php.net/manual/en/features.connection-handling.php:
当PHP脚本正常运行时 NORMAL状态是活动的。如果 远程客户端断开ABORTED 州旗已开启。一个遥控器 客户端断开通常是由 用户按下STOP按钮。
您可以决定是否需要 客户断开连接导致您的 要中止的脚本。有时它是 总是让你的脚本运行方便 完成即使没有 远程浏览器接收输出。 但是默认行为是 你的脚本要在中止时中止 远程客户端断开连接。这个 行为可以通过
ignore_user_abort
php.ini指令为 以及通过相应的php_value ignore_user_abort
Apache httpd.conf指令或者用ignore_user_abort()
功能。
这似乎表明您的问题的答案是“是的,如果用户离开页面,脚本将终止”。
然而,要意识到这取决于所使用的后端SAPI(例如,mod_php
),php cannot detect that the client has aborted the connection until an attempt is made to send information to the client。如果长时间运行的脚本未发出flush()
,即使用户已关闭连接,脚本也可能继续运行。
即使您执行定期调用flush()
,使output buffering打开也会导致这些调用陷入并且不会将其发送到客户端直到剧本完成!
进一步复杂的事情是,如果您安装了缓冲响应的Apache处理程序(例如mod_gzip
),那么php将再次检测到连接已关闭且脚本将保持关于货运。
呼。
答案 1 :(得分:6)
这取决于您的设置 - 通常它会停止,但您可以使用ignore_user_abort()
继续设置。
答案 2 :(得分:1)
根据Web服务器和/或PHP的配置,当用户终止HTTP连接时,PHP进程可能会或可能不会终止该线程。如果用户离开页面时AJAX请求处于待处理状态,则它取决于浏览器查杀服务器配置的请求(不保证) ontop (不保证)。不是你想听到的答案!
我建议在平面文件或数据库中创建工作队列,以便持续运行的PHP daemon可以轮询作业。它不会受cron
延迟的影响,但会将CPU /内存使用率保持在可用的水平。作业完成后,将结果放在平面文件/数据库中以进行AJAX提取。或者承诺在作业完成后通过电子邮件发送给用户(我的首选方法)。
希望有所帮助
答案 3 :(得分:0)
如果客户端/用户/下载程序/查看器中止或断开连接,脚本将继续运行,直到尝试刷新新数据执行客户端。除非你使用过
ignore_user_abort()
,脚本会死在那里。
按照相同的顺序,PHP无法确定客户端是否仍在那里而不尝试将任何数据刷新到httpd。
答案 4 :(得分:0)
找到了我的案例的实际解决方案,没有终止连接。我的Apache / Php服务器上的SESSION需要在下一个服务器开始之前关闭。