连接关闭时终止 PHP 进程

连接关闭时终止 PHP 进程

我已向 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

https://stackoverflow.com/questions/23530820/php-connection-aborted-does-not-always-works/29401757#29401757

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 在用户关闭窗口时向服务器发送消息,但我认为该功能在某些较新的浏览器中被禁用,因为它经常用于烦人的弹出广告等。

相关内容