服务器发送的PHP事件

pepwfjgg  于 2023-04-04  发布在  PHP
关注(0)|答案(2)|浏览(377)

我有一个web应用程序,它从js脚本发送一些数据到php服务器,php服务器将数据插入mysql数据库,我还需要通知所有其他客户端数据已经发送并发送给他们。
我尝试使用Server-Sent Events来实现这一点,但我在理解这个概念时遇到了一些困难。下面是我的代码:

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

hc8w905p

hc8w905p1#

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

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!
我的压力测试结果:(服务器配置:4Core@2.3Ghz,8 Gb Ram,100/100 Mbit)Ubuntu 14.04+Apache,最大连接数:1024
100连接负载= 0.14,1 SQL查询/滴答和1秒刷新率。
低于500-600活跃用户,您可以使用PHP进行SSE,即使使用Apache也没有任何问题。

z31licg0

z31licg02#

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

相关问题