我正在查看Server-Sent Events
,因为客户端位于共享托管,我无法使用websockets。
我测试了一个W3School's example并且它正在工作。我的代码如下:
Index.php(相关部分):
<script>
var source=new EventSource("data.php");
source.onmessage=function(event)
{
document.getElementById("result").innerHTML+=event.data + "<br>";
};
</script>
Data.php:
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();
?>
现在,输出我看起来像这样:
The server time is: Wed, 24 Apr 2013 13:31:25 +0200
The server time is: Wed, 24 Apr 2013 13:31:28 +0200
The server time is: Wed, 24 Apr 2013 13:31:31 +0200
The server time is: Wed, 24 Apr 2013 13:31:34 +0200
The server time is: Wed, 24 Apr 2013 13:31:37 +0200
The server time is: Wed, 24 Apr 2013 13:31:40 +0200
The server time is: Wed, 24 Apr 2013 13:31:43 +0200
The server time is: Wed, 24 Apr 2013 13:31:46 +0200
The server time is: Wed, 24 Apr 2013 13:31:49 +0200
我注意到,time-interval
此处 3秒。
我的问题是:如何更改此时间间隔?
在data.php
我打算使用代码发送请求并获取响应,但数量为请求是有限的,所以我需要更大的间隔。
这是解决问题的好方法,还是应该使用polling
?
对不起,如果我不够清楚,我真的不确定如何描述问题。
谢谢!
答案 0 :(得分:2)
您可能不喜欢这样,但事实是 - 您没有正确使用它。
PHP脚本不应该终止 - 您应该使用循环。使用此循环,您还可以控制间隔(最简单的方法是sleep($seconds)
)。
while(true) {
$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();
sleep(3); // interval: 3 seconds
}
您的脚本似乎工作的原因是浏览器总是尝试重新建立连接,因为事件流已终止(浏览器认为是错误)。但是,这与仅每X秒轮询服务器没有什么不同,从而消除了事件流的优势。
此外,建议不要将Apache和PHP用于事件流 - Apache不是为无限期保持打开的连接而设计的(这可能不再适用 - 没有及时更新),许多主机限制PHP脚本的执行时间。使用不同的Web服务器,或使用轮询,以避免潜在的问题。