用户离开页面后,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调用完成。