我正在查看
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
?
抱歉,如果我不够清楚,我真的不知道如何描述问题。
谢谢!
你可能不喜欢这个,但事实是——你没有正确使用它。
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 脚本的时间。要么使用不同的网络服务器,要么使用轮询,以避免潜在的问题。
您可以使用 echo 数据: 使用 cicle
不到 3 秒 <?php
header( 'Cache-Control: no-cache' );
header( 'Content-Type: text/event-stream' );
header( 'X-Accel-Buffering: no' );
ob_implicit_flush( true );
ob_end_flush();
for ( $i = 0; $i < 30; $i++ ) {
$data = "data: $i";
echo $data . "\n\n";
if(ob_get_level()>0){ob_flush();}
flush();
usleep(500000);
}
echo "data: Done!\n\n";