用户离开页面后,php执行是否停止?

Ste*_*ger 39 php ajax cron execution

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

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

Cre*_*esh 73

这取决于.

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

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

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

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

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

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

复杂的是,如果你安装了缓冲响应的Apache处理程序(例如mod_gzip),那么php将再次检测到连接已关闭且脚本将继续运行.

唷.

  • 非常详细的+1 (6认同)

Gre*_*reg 6

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

  • 在http://www.php.net/manual/en/function.ignore-user-abort.php上有一个很大的警告,如果无法将数据发送到客户端,则"ignore_user_abort()"无法保证工作.可以在许多场景中发生.看我的回答. (6认同)