1

我在看Server-Sent Events,因为客户端在共享主机上,我不能使用 websockets。

我已经测试了W3School 的示例,它运行良好。我的代码如下所示:

Index.php(相关部分):

<script>
    var source=new EventSource("data.php");
    source.onmessage=function(event)
    {
        document.getElementById("result").innerHTML+=event.data + "<br>";
    };
</script>

数据.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

对不起,如果我不够清楚,我真的不知道如何描述这个问题。
谢谢!

4

1 回答 1

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

于 2013-04-24T11:53:47.850 回答