apache – HTML5 Server-Sent事件原型 – 模糊错误和重复轮询?

我试图抓住服务器端事件,因为它们完美符合我的要求,看起来应该很容易实现,但是我不能超越一个模糊的错误,看起来像连接被重复地关闭和重新-opened.我尝试的一切都是基于 this和其他教程.

PHP是一个单一的脚本:

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

function sendMsg($id, $msg) {
  echo "id: $id" . PHP_EOL;
  echo "data: $msg" . PHP_EOL;
  echo PHP_EOL;
  ob_flush();
  flush();
}

$serverTime = time();
sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
?>

并且JavaScript看起来像这样(在体负载上运行):

function init() {

    var source;
    if (!!window.EventSource) {
        source = new EventSource('events.php');
        source.addEventListener('message', function(e) {
            document.getElementById('output').innerHTML += e.data + '<br />';
        }, false);
        source.addEventListener('open', function(e) {
            document.getElementById('output').innerHTML += 'connection opened<br />';
        }, false);
        source.addEventListener('error', function(e) {
            document.getElementById('output').innerHTML += 'error<br />';
        }, false);
    }
    else {
        alert("Browser doesn't support Server-Sent Events");
    }
}

我搜索了一下,但找不到信息

>如果Apache需要任何特殊配置来支持服务器发送的事件,
>我如何通过这种设置启动服务器的推送(例如,我可以简单地从CLI执行PHP脚本来推送已经连接的浏览器?)

如果我在Chrome(16.0.912.77)中运行这个JS,它将打开连接,接收时间,然后发送错误(在错误对象中没有有用的信息),然后在3秒钟内重新连接并进行相同的过程.在Firefox(10.0)中,我得到相同的行为.

编辑1:我认为这个问题可能与我使用的服务器有关,所以我在一个香草XAMPP安装上测试,同样的错误出现.基本的服务器配置是否能够处理这个没有修改/额外配置?

编辑2:以下是浏览器的输出示例:

connection opened
server time: 01:47:20
error
connection opened
server time: 01:47:23
error
connection opened
server time: 01:47:26
error

谁能告诉我这是怎么回事?我看过的教程使它看起来像SSE非常简单.对我上面两个编号的问题的任何答案也是非常有帮助的.

谢谢.

问题是你的php.

通过写入php脚本的方式,每个执行只发送一个消息.如果您直接访问php文件,那么它是如何工作的,如果您使用EventSource访问该文件,那么它是如何工作的.所以为了让你的php脚本发送多个消息,你需要一个循环.

<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

function sendMsg($id, $msg) {
  echo "id: $id" . PHP_EOL;
  echo "data: $msg" . PHP_EOL;
  echo PHP_EOL;
  ob_flush();
  flush();
}
while(true) {
  $serverTime = time();
  sendMsg($serverTime, 'server time: ' . date("h:i:s", time()));
  sleep(1);
}
?>

我已经改变了你的代码,包括一个无限循环,等待每个消息发送1秒后(按照这里的一个例子:Using server-sent events).

这种类型的循环是我正在使用的,它消除了常量连接丢弃并每3秒重新连接一次.但是(我只在chrome中测试过),连接现在只有30秒才能存活.我会继续弄清楚为什么会出现这种情况,当我找到一个解决方案时,我会发布一个解决方案,但直到那时,这应该至少让你更接近你的目标.

希望有帮助,

编辑:

为了让php连接打开很长时间,你需要设置max_execution_time(感谢tomfumb为此).这可以通过至少三种方式实现:

>如果您可以更改您的php.ini,请更改“max_execution_time”的值.这将允许您指定的所有脚本运行.>在您希望运行很长时间的脚本中,使用函数ini_set(key,value),其中key为’max_execution_time’,value为您希望脚本运行的时间.>在您希望运行很长时间的脚本中,使用函数set_time_limit(n),其中n是希望脚本运行的秒数.

相关文章
相关标签/搜索