服务器发送事件:更改时间间隔

时间:2013-04-24 11:38:24

标签: php server-sent-events

我正在查看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

对不起,如果我不够清楚,我真的不确定如何描述问题。
谢谢!

1 个答案:

答案 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服务器,或使用轮询,以避免潜在的问题。