使用PHP的服务器发送事件

时间:2015-08-20 10:31:11

标签: javascript php mysql ajax server-sent-events

我有一个网络应用程序,它将一些数据从js脚本发送到php服务器,然后将其插入到mysql数据库中。我还需要通知所有其他客户端数据已发送并发送给他们。

我尝试使用服务器发送事件来执行此操作,但我在理解这个概念时遇到了一些麻烦。这是我的代码:

$(document).ready(function() {
    var source = new EventSource("../Server/insertMessage.php");
    if(typeof(EventSource) == "undefined") {
        alert("event source doesnt work");
    } else { alert("event source works"); }

    source.onmessage = function(event) {
        alert(event.data);
        // do stuff with event.data
    };
});

在我的js脚本中,我向insertMessage.php发送一个AJAX请求,其中包含POST参数作为数据详细信息。这会触发服务器端事件吗?这是我的服务器端代码:

insertMessage.php

if(isset(// check POST to see if the right request was sent)) {
    // insert data into database
    // ...
    // ...

    // Send the new data to listeners
    header('Content-Type: text/event-stream');
    header('Cache-Control: no-cache');
    // Create data array
    $dataArray = array("data" => $data, "moreData" => $moreData);
    // Encode JSON
    $callback = json_encode($dataArray);
    // Send it
    echo "data: $callback";
    flush();
}

虽然"事件源工作"发送警报,即使我正在向event.data进行AJAX调用,我也从未收到insertMessage.php警报。我可能还没完全理解Server-Sent Events。我做错了什么?

2 个答案:

答案 0 :(得分:2)

您不能以这种方式使用服务器发送事件:

使用此:

session_write_close(); //在回复之前关闭会话!它可以帮助您的客户在执行期间向您的服务器创建新请求。

    $echo= "id: $time" . PHP_EOL; // Important!
    $echo.= "retry: ".$retry_time."" . PHP_EOL;  // Handle reconnect time (ms)
    $echo.= "event: message" . PHP_EOL; // Event message type
    $echo.= "data: {\n"; // JSON
    $echo.= "data: \"data\": \"$data\" \n";  // JSON
    $echo.= "data: }\n"; // JSON
    $echo.= PHP_EOL; // Important!

换行符在Eventsource中非常重要!

您可以使用PHP进行SSE,但请记住,您应该在执行期间尽快关闭SESSION!

我的压力测试结果:(服务器配置:4Core @ 2.3Ghz,8Gb Ram,100 / 100Mbit)Ubuntu 14.04 + Apache,最大连接数:1024

100连接负载= 0.14,具有1个SQL查询/刻度和1秒刷新率。

低于500-600的活跃用户,即使使用Apache,您也可以毫无问题地使用PHP进行SSE。

答案 1 :(得分:0)

这不起作用的原因是因为当您的JavaScript创建EventSource或正在执行HTTP GET时。所以你的PHP代码没有返回任何东西。您无法使用EventSource执行POST请求。

相关问题