我已向 SO 发布了以下问题,但认为可能存在基于服务器的解决方案。
https://stackoverflow.com/questions/9053964/php-script-with-sleep-does-not-exit-on-connection-close
我正在运行 Ubuntu VPS 来运行该脚本,并尝试让该脚本在用户关闭浏览器窗口/选项卡时终止。
有几个基于 PHP 的函数可以查看连接是否仍然打开,但没有一个起作用(相信我,我已经测试了所有函数)。
关于如何通过服务器做到这一点,您有什么有创意的想法吗?
答案1
当您尝试这些方法时,您是否强制 PHP 刷新缓冲区?除非从脚本写入某些内容,否则 PHP/Apache 将无法查看客户端是否仍处于连接状态。请记住,PHP 并不直接与客户端通信 - 而是与 Apache 通信。
评论在底部connection_aborted PHP 手册包含多种策略。
答案2
TCP 要求客户端确认所有发送的数据包,因此服务器至少应该将其检测为发送超时......
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();
}
答案3
如果 Web 浏览器没有关闭连接,您的脚本可能会一直运行,直到连接超时或达到 PHP 的最大执行时间。
我能想到的最好的办法是使用 AJAX 定期“ping”服务器,并在一段时间内没有收到这些 ping 时停止。或者每次收到 ping 时,给 PHP 脚本多 5 秒钟的时间运行。
或者您可以尝试使用 AJAX 在用户关闭窗口时向服务器发送消息,但我认为该功能在某些较新的浏览器中被禁用,因为它经常用于烦人的弹出广告等。