php 执行会在用户离开页面后停止吗?

2022-08-30 12:02:11

我想根据一些表单输入运行一个相对耗时的脚本,但我宁愿不诉诸cron,所以我想知道通过ajax请求的php页面是否会继续执行直到完成,或者如果用户离开页面,它是否会停止。

它实际上不会输出到浏览器,直到文件末尾的json_encode,所以在此之前的所有内容是否仍然执行?


答案 1

这要视情况而定。

http://us3.php.net/manual/en/features.connection-handling.php

当 PHP 脚本正常运行时,NORMAL 状态为活动状态。如果远程客户端断开连接,则 ABORTED 状态标志处于打开状态。远程客户端断开连接通常是由用户点击其 STOP 按钮引起的。

您可以决定是否希望客户端断开连接以导致脚本中止。有时,即使没有远程浏览器接收输出,也始终让脚本运行到完成是很方便的。但是,默认行为是在远程客户端断开连接时中止脚本。此行为可以通过 php.ini 指令以及相应的 Apache httpd.conf 指令或使用函数进行设置。ignore_user_abortphp_value ignore_user_abortignore_user_abort()

这似乎表明您的问题的答案是“是的,如果用户离开页面,脚本将终止”。

但是要注意,根据所使用的后端SAPI(例如,),php无法检测到客户端已中止连接,直到尝试向客户端发送信息。如果长时间运行的脚本未发出 a,则即使用户已关闭连接,脚本也可能继续运行。mod_phpflush()

使事情复杂化的是,即使您确实发出定期调用,打开输出缓冲也会导致这些调用陷印,并且在脚本完成之前不会将它们发送到客户端!flush()

更复杂的是,如果您安装了缓冲响应的Apache处理程序(例如),那么php将再次无法检测到连接已关闭,并且脚本将继续使用卡车运输。mod_gzip

唷。


答案 2

这取决于您的设置 - 通常它会停止,但您可以使用ignore_user_abort()来使其继续。


推荐