我在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)。但不幸的是,已知这种解决方案不可靠。在我看来,这不是一个“专业”的选择。
有没有办法在客户端退出时正确终止服务器端脚本?
答案 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);
}