Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 服务器使用PHP发送事件_Javascript_Php_Mysql_Ajax_Server Sent Events - Fatal编程技术网

Javascript 服务器使用PHP发送事件

Javascript 服务器使用PHP发送事件,javascript,php,mysql,ajax,server-sent-events,Javascript,Php,Mysql,Ajax,Server Sent Events,我有一个web应用程序,它将一些数据从js脚本发送到php服务器,然后将其插入mysql数据库。我还需要通知所有其他客户数据已经发送并发送给他们 我正试图使用服务器发送的事件来实现这一点,但我在理解这个概念时遇到了一些困难。这是我的密码: $(document).ready(function() { var source = new EventSource("../Server/insertMessage.php"); if(typeof(EventSource) == "und

我有一个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参数作为数据细节。这是否会触发服务器端事件?以下是我的服务器端代码:

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

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

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

使用以下命令:

会话_写入_关闭();//在响应之前关闭会话!它可以帮助您的客户机在执行期间向您的服务器创建新请求

    $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 for SSE,但请始终记住,在执行过程中应尽快关闭会话a

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

100连接负载=0.14,1个SQL查询/勾选,1秒刷新率


在500-600活动用户以下,即使使用Apache,您也可以毫无问题地使用PHP for SSE。

您可能需要了解Node.js和web套接字。PHP无法启动任何连接。客户端必须连接到服务器。@CharlotteDunois,但我不会使用PHP启动任何连接。我只是试图在事件发生时将一些数据从服务器发送到客户端。我不能完全确定我是否正确地从服务器触发了事件。您需要使用Node.js和web套接字。PHP不能做你想做的事情。@CharlotteDunois你介意给我更多关于我将如何做的细节吗?@CharlotteDunois在这方面绝对正确。您试图做的是将数据从服务器推送到客户端。如果客户端和服务器之间没有活动连接,则无法执行此操作。您应该寻找的技术最好是
推送通知
WebSocket
。您也可以使用AJAX,但这很棘手,您需要每隔N秒向服务器发送请求以“检查”新数据。