php 执行会在用户离开页面后停止吗?
我想根据一些表单输入运行一个相对耗时的脚本,但我宁愿不诉诸cron,所以我想知道通过ajax请求的php页面是否会继续执行直到完成,或者如果用户离开页面,它是否会停止。
它实际上不会输出到浏览器,直到文件末尾的json_encode,所以在此之前的所有内容是否仍然执行?
我想根据一些表单输入运行一个相对耗时的脚本,但我宁愿不诉诸cron,所以我想知道通过ajax请求的php页面是否会继续执行直到完成,或者如果用户离开页面,它是否会停止。
它实际上不会输出到浏览器,直到文件末尾的json_encode,所以在此之前的所有内容是否仍然执行?
这要视情况而定。
从 http://us3.php.net/manual/en/features.connection-handling.php:
当 PHP 脚本正常运行时,NORMAL 状态为活动状态。如果远程客户端断开连接,则 ABORTED 状态标志处于打开状态。远程客户端断开连接通常是由用户点击其 STOP 按钮引起的。
您可以决定是否希望客户端断开连接以导致脚本中止。有时,即使没有远程浏览器接收输出,也始终让脚本运行到完成是很方便的。但是,默认行为是在远程客户端断开连接时中止脚本。此行为可以通过 php.ini 指令以及相应的 Apache httpd.conf 指令或使用函数进行设置。
ignore_user_abort
php_value ignore_user_abort
ignore_user_abort()
这似乎表明您的问题的答案是“是的,如果用户离开页面,脚本将终止”。
但是要注意,根据所使用的后端SAPI(例如,),php无法检测到客户端已中止连接,直到尝试向客户端发送信息。如果长时间运行的脚本未发出 a,则即使用户已关闭连接,脚本也可能继续运行。mod_php
flush()
使事情复杂化的是,即使您确实发出定期调用,打开输出缓冲也会导致这些调用陷印,并且在脚本完成之前不会将它们发送到客户端!flush()
更复杂的是,如果您安装了缓冲响应的Apache处理程序(例如),那么php将再次无法检测到连接已关闭,并且脚本将继续使用卡车运输。mod_gzip
唷。