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

我想运行一个相对耗时的脚本基于一些forms的input,但我宁愿不求助于cron,所以我想知道如果通过ajax请求的PHP页面将继续执行,直到完成或如果它将停止用户离开页面。

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

这取决于。

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

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

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

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

但是要明白,根据使用的后端SAPI(例如, mod_php ), php无法检测到客户端已经中止连接,直到尝试向客户端发送信息 。 如果长时间运行的脚本不发出flush() ,则即使用户closures了连接,脚本也可能继续运行。

复杂的事情是,即使您定期调用flush() , 输出缓冲将导致这些调用陷阱,并不会将它们发送到客户端,直到脚本完成无论如何!

复杂的事情是,如果你已经安装了缓冲响应的Apache处理程序(例如mod_gzip ),那么php将不会检测到连接已closures,脚本将继续运输。

唷。

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

根据Web服务器和/或PHP的configuration,当用户终止HTTP连接时,PHP进程可能会或可能不会中止线程。 如果一个AJAX请求在用户离开页面时处于挂起状态,它将依赖于浏览器来终止服务器configuration(不保证)的请求(不保证)。 不是你想听到的答案!

我build议在平面文件或数据库中创build一个工作队列,以便持续运行的PHP守护进程可以轮询作业。 它不会受到cron延迟的影响,但会将CPU /内存使用量保持在可用的水平。 作业完成后,将结果放在平面文件/数据库中进行AJAX抓取。 或者承诺一旦工作完成(我的首选方法),通过电子邮件发送给用户。

希望有所帮助

如果客户端/用户/下载/查看器中止或断开,脚本将继续运行,直到尝试刷新客户端的新数据。 除非你使用了ignore_user_abort() ,否则脚本将会死在那里。 按照相同的顺序,PHP无法确定客户端是否仍然存在,而不会尝试将任何数据刷新到httpd。

发现我的情况下,它没有终止连接的实际解决scheme。 我的Apache / Php服务器上的SESSION需要在下一个启动之前closures。

浏览器在中止之后等待ajax调用完成。