如何创建和检测一次性服务器发送事件?

时间:2013-09-06 04:28:40

标签: php javascript post server-sent-events

我正在尝试让客户端实例能够检测其他客户端实例何时发布内容,然后检索该帖子。 (所以我想这就像一个聊天系统,但对于我的实现它并不意味着那个)

我正在尝试使用服务器端事件。

我注意到,使用基本的SSE结构,客户端的Javascript监听传入的服务器PHP输出,每隔几秒左右就会得到一个连续的消息流。

如何将用户实例POST数据(通过HTML表单)发送到服务器PHP脚本,该脚本接收数据并将其转换为SSE-Style JSON,输出(echo)它,然后拥有所有用户-instances检测并检索一个帖子,只检测一次?

例如,这是我的基本SSE结构:

用于接收POST数据和输出JSON数据的PHP脚本(stream.php)

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

    function sendMsg($name, $msg) {
      echo "data: {\n";
      echo "data: \"name\": \"$name\", \n";
      echo "data: \"msg\": \"$msg\", \n";
      echo "data: \"id\": 1\n";
      echo "data: }\n";
      echo PHP_EOL;
      ob_flush();
      flush();
    }

    sendMsg($_POST['name'], $_POST['message']);

客户端Javascript侦听和接收服务器发送数据(在index.php内)

var source = new EventSource('stream.php');
        }               

        source.addEventListener('message', function(e) {
            var data = JSON.parse(e.data);
            $("#stream").prepend(
                "<div class='newitem'>" +
                data.name + ": " + data.msg + 
                "</div>"
            )
        }, false);

<div id="stream">下,我会按照我自己的要求每3秒连续获得一次undefined。像这样:

undefined undefined
undefined undefined
undefined undefined
....

现在,我如何拥有如下表格,并让上述流检测并显示提交的数据?

HTML表格向服务器发送数据(在index.php内)

<form action="stream.php" method="POST">
    <input name="name" id="name" type="text"/>

    <textarea id="message" name="message"></textarea>
    <br>
    <input name="submit" id="submit" type="submit" value="Send"/>    
</form>

所以希望我<div id="stream">下的视频流看起来像这样?

undefined undefined
Bob: Hello
undefined undefined
....

目前,即使stream.php实际上正在检索表单数据,但由于某种原因它不会显示。它仍将继续读取未定义(或者更确切地说,不显示任何内容)。 / p>

如果我能实现这一点,我计划过滤掉undefined undefined个消息,这样只有定义的消息才会显示在客户端流中。

1 个答案:

答案 0 :(得分:0)

您可能想要使用Web SocketsSocket.io如果您使用的是node.js,那就太棒了,但也有php libraries来帮助您,