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

问题描述 投票:0回答:2

我正在查看

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 server-sent-events
2个回答
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 脚本的时间。要么使用不同的网络服务器,要么使用轮询,以避免潜在的问题。


0
投票

您可以使用 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";
© www.soinside.com 2019 - 2024. All rights reserved.