我想基于某种形式的输入运行相对耗时的脚本,但我宁愿不求助于cron,所以我想知道通过ajax请求的php页面是否将继续执行直到完成,或者如果该脚本页面停止,用户离开页面。
它直到文件末尾的json_encode才真正输出到浏览器,那么在此之前的所有内容仍然可以执行吗?
这取决于。
从http://us3.php.net/manual/zh/features.connection- handling.php:
当PHP脚本正常运行时,NORMAL状态处于活动状态。如果远程客户端断开连接,则ABORTED状态标志将打开。远程客户端断开连接通常是由用户按下STOP按钮引起的。 您可以决定是否希望客户端断开连接以导致脚本中止。有时,即使没有远程浏览器接收到输出,始终将脚本运行至完整状态也很方便。但是,默认行为是当远程客户端断开连接时脚本将中止。可以通过ignore_user_abortphp.ini指令以及相应的 php_value ignore_user_abortApache httpd.conf指令或通过 ignore_user_abort()函数来设置此行为 。
当PHP脚本正常运行时,NORMAL状态处于活动状态。如果远程客户端断开连接,则ABORTED状态标志将打开。远程客户端断开连接通常是由用户按下STOP按钮引起的。
您可以决定是否希望客户端断开连接以导致脚本中止。有时,即使没有远程浏览器接收到输出,始终将脚本运行至完整状态也很方便。但是,默认行为是当远程客户端断开连接时脚本将中止。可以通过ignore_user_abortphp.ini指令以及相应的 php_value ignore_user_abortApache httpd.conf指令或通过 ignore_user_abort()函数来设置此行为 。
ignore_user_abort
php_value ignore_user_abort
ignore_user_abort()
这似乎表示您问题的答案是“是的,如果用户离开页面,脚本将终止”。
但是请意识到,根据所使用的后端SAPI(例如mod_php),php无法检测到客户端已中止连接,直到尝试向客户端发送信息为止。如果长时间运行的脚本没有发出flush(),即使用户已关闭连接,该脚本也可能继续运行。
mod_php
flush()
事情复杂是,即使你 做的 到的问题定期调用flush(),其输出缓冲,将导致捕获这些电话,并直到脚本完成反正不会送他们到客户端!
进一步 复杂化的事情是,如果你已经安装了Apache处理程序缓存的响应(例如mod_gzip),然后再次PHP将无法检测到连接被关闭,该脚本将继续卡车。
mod_gzip
ew