服务器使用 PHP 发送事件

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

我有一个 Web 应用程序,它将一些数据从 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 参数作为数据详细信息。这会触发服务器端事件吗?这是我的服务器端代码:

插入消息.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
警报,即使我正在对
insertMessage.php
进行 AJAX 调用。我可能还没有完全理解服务器发送的事件。我做错了什么?

javascript php mysql ajax server-sent-events
3个回答
3
投票

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

使用这个:

session_write_close(); // Close the session before your response! It helps your client create new requests to you server during the execution.

$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!

我的压力测试结果:(服务器配置:[email protected],8Gb RAM,100/100Mbit)Ubuntu 14.04+Apache,最大连接数:1024

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

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


0
投票

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


0
投票
Just add this line `echo "\n\n";`
So your code will look like the below code

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";
    echo "\n\n";
    flush();
}
© www.soinside.com 2019 - 2024. All rights reserved.