使用服务器发送的事件发布到PHP?

使用服务器发送的事件发布到PHP?,php,ajax,post,polling,server-sent-events,Php,Ajax,Post,Polling,Server Sent Events,是否可以像在Ajax中一样使用SSE将POST数据发送到PHP 我已经使用AJAX很长一段时间了,在长时间的轮询技术中,结果很糟糕。我也一直在考虑WebSocket,但它似乎有点多余。不,SSE无法向服务器发送任何数据 您仍然可以使用SSE实时读取数据,并使用AJAX上传任何数据(您可能需要一个共享数据库在AJAX接收进程和SSE发送进程之间传递信息)。您可以通过GET发送数据 e、 g 这是一个简单的脚本,它向服务器发送迭代次数,服务器使用SSE返回进度 该项目由两个文件(index.php和

是否可以像在Ajax中一样使用SSE将POST数据发送到PHP


我已经使用AJAX很长一段时间了,在长时间的轮询技术中,结果很糟糕。我也一直在考虑WebSocket,但它似乎有点多余。

不,SSE无法向服务器发送任何数据


您仍然可以使用SSE实时读取数据,并使用AJAX上传任何数据(您可能需要一个共享数据库在AJAX接收进程和SSE发送进程之间传递信息)。

您可以通过GET发送数据

e、 g

这是一个简单的脚本,它向服务器发送迭代次数,服务器使用SSE返回进度

该项目由两个文件(index.php和ssedemo.php)组成

php包含一个文本框和一个按钮。文本框假设包含ssedemo.php中循环的迭代次数

    <h2>Server Sent Event Test</h2>
    <form>
        <label>Process Duration</label>
        <input type="text" id="progVal">
        <input type="button" value="Get Messages" onclick="updateProgress()"/>
    </form>
    <div id="container">
    </div>
此函数使用jQuery获取文本框的内容,然后创建一个文本框。EventSource()构造函数接受一个或两个参数。第一个指定要连接到的URL。第二个以EventSourceInit字典的形式指定设置(如果有)

您可以通过将它添加到URL来传递所需内容,就像使用GET一样

“ssedemo.php?duration=“+encodeURIComponent(input)

在服务器端,您必须根据需要设置头类型并禁用缓存

然后像往常一样使用$\u get获取数据

$TotalNo = $_GET['duration'];
for ($i = 1; $i <= $TotalNo; $i++) {
    updateProgress($i, $TotalNo);
    sleep(1);
}


function updateProgress($currentVal, $totalNo) {
    $completionPrecentage = $currentVal / $totalNo * 100;
    echo "event: progress\n";
    echo 'data: {"progress": "' . $completionPrecentage . '"}';
    echo "\n\n";
    ob_flush();
    flush();
}
$TotalNo=$\u GET['duration'];

对于($i=1;$i),EventSource API不支持POST方法,但这并不意味着您不能将SSE与POST一起使用。您只是不能使用EventSource API。 但是,也有其他的实现。例如,允许您指定有效负载,如果需要,还可以指定头。sse.js应该是EventSource的替代品,例如:

var source = new SSE("get_message.php");
source.onmessage=function(event)
{
    document.getElementById("message-window").innerHTML+=event.data + "<br>";
};
而且,由于它是完全兼容的polyfill,您可能可以执行以下操作:

EventSource = SSE;
var source = new EventSource("get_message.php", {payload: 'Hello World'});
source.onmessage=function(event)
{
    document.getElementById("message-window").innerHTML+=event.data + "<br>";
};
EventSource=SSE;
var source=neweventsource(“get_message.php”,{payload:'Hello World'});
source.onmessage=函数(事件)
{
document.getElementById(“消息窗口”).innerHTML+=event.data+“
”; };
SSE设计用于单向推送,而不是双向通信-对于这种情况,Web套接字可能更合适node.js,@tomfumb我只发布2字节无关的数据;据我所知(受限于SSE没有很好的文档记录)从客户端到服务器的唯一通信是启动连接。一旦建立了链接(或在发生故障时重新建立链接)数据只能单向流动。我曾经问过一个问题,突出了PHP在SSE方面的不足:欢迎使用堆栈溢出!虽然这在理论上可以回答这个问题,但请在这里包含答案的基本部分,并提供链接供参考。
$TotalNo = $_GET['duration'];
for ($i = 1; $i <= $TotalNo; $i++) {
    updateProgress($i, $TotalNo);
    sleep(1);
}


function updateProgress($currentVal, $totalNo) {
    $completionPrecentage = $currentVal / $totalNo * 100;
    echo "event: progress\n";
    echo 'data: {"progress": "' . $completionPrecentage . '"}';
    echo "\n\n";
    ob_flush();
    flush();
}
var source = new SSE("get_message.php");
source.onmessage=function(event)
{
    document.getElementById("message-window").innerHTML+=event.data + "<br>";
};
var source = new SSE("get_message.php", {payload: 'Hello World'});
EventSource = SSE;
var source = new EventSource("get_message.php", {payload: 'Hello World'});
source.onmessage=function(event)
{
    document.getElementById("message-window").innerHTML+=event.data + "<br>";
};