客户端退出时,PHP SSE脚本不会死亡

时间:2018-03-13 13:44:44

标签: javascript php jquery server-sent-events

我在PHP / jQuery中使用服务器端事件。这是客户方:

var evtSource = new EventSource("testsse.php");
        evtSource.onmessage = function(e) {
           // DO SOMETHING WITH e
        }

这是服务器端文件:testsse.php

header("Content-Type: text/event-stream\n\n");
while (1) {
  echo "message";  
  ob_flush();
  flush();
  sleep(1);
}

它工作正常,但当客户端关闭其浏览器或断开连接时,testsse.php继续运行。我的问题是我们很快就有许多运行脚本使服务器过载。我已经阅读了以下问题:

我已经阅读了以下问题:

最后一个很有意思,但最终服务器告诉客户端这是结束。在我们的例子中,我们希望脚本在客户端关闭时自动死亡。一种解决方案是在关闭选项卡或浏览器时触发事件(Detect browser or tab closing)。但不幸的是,已知这种解决方案不可靠。在我看来,这不是一个“专业”的选择。

有没有办法在客户端退出时正确终止服务器端脚本?

1 个答案:

答案 0 :(得分:1)

最简单的解决方案是让脚本timeout并使用内置retry方法。

这意味着连接将定期关闭,如果用户仍然在那里,将从前端重新启动连接。

html5rocks.com有一个很好的SSE here教程。

某些伪代码表示我的意思

JavaScript代码

var evtSource = new EventSource("testsse.php");
evtSource.onmessage = function(e) {
  // DO SOMETHING WITH e
}

PHP代码

header("Content-Type: text/event-stream\n\n");

//Live for 60 seconds
set_time_limit(60);

//Set retry to ~1/60 second
echo "retry: 16\n\n";
ob_flush();
flush();

//Run your loop
//It will die in 60
while (1) {
  echo "message";  
  ob_flush();
  flush();
  sleep(1);
}