我已经发布了以下问题,但认为可能有一个基于服务器的解决scheme。
https://stackoverflow.com/questions/9053964/php-script-with-sleep-does-not-exit-on-connection-close
我正在运行一个Ubuntu VPS来运行这个脚本,并且当用户closures他的浏览器的窗口/标签页时,我试图让脚本死掉。
有几个基于PHP的函数来查看连接是否仍然打开,但没有任何工作(相信我,testing所有)。
任何有关如何通过服务器可以做到这一点的创意?
当你试用这些方法时,你是否强制PHP刷新缓冲区? 直到从脚本写入东西,PHP / Apache将无法看到客户端是否仍然连接。 请记住,PHP不直接与客户端通信 – 它与Apache进行通信。
这个注释是connection_aborted PHP手册的底部包含几个策略。
TCP要求客户端确认所有发送的数据包,因此服务器至less应该将其检测为发送超时。
session_write_close();//to make flush work while (connection_status() !== 0) {//this will work if the connection is properly shutdown //or if it is simply disconnected... sleep(1); echo "whatever"; ob_flush(); flush(); }
如果Web浏览器没有closures连接,那么脚本可能会一直运行,直到连接超时,或者它达到PHP的最大执行时间。
我能想到的最好的事情就是使用AJAX定期“ping”服务器,并在一段时间内没有收到ping命令时停止。 或者每次收到一个ping命令,给PHP脚本5秒钟以上运行。
或者,当用户closures窗口时,您可以尝试使用AJAX向服务器发送消息,但是我认为这种function在一些较新的浏览器中被禁用,因为它经常用于恼人的popup式广告等。