向PHP POST并使用服务器发送事件?

6

能否像使用Ajax一样使用SSE将POST数据发送到PHP?

我已经使用AJAX相当长的时间了,但在长轮询技术中效果不佳。我也考虑过WebSockets,但它似乎有点冗余。


1
SSE被设计用于单向推送,而不是双向通信 - 对于这种情况,Web Sockets可能更合适。 - tomfumb
Node.js怎么样?http://nodejs.org - FirmView
就我所知(受到SSE文档缺乏的限制),客户端向服务器允许进行的唯一通信是初始化连接。一旦链接建立(或在失败情况下重新建立),数据仅单向流动,其他都与此无关。 - tomfumb
请看我曾经提出的一个问题,强调了PHP在SSE方面的不足:https://dev59.com/r2ox5IYBdhLWcg3wpFz5 - tomfumb
@tomfumb,除了ajax和websockets,没有其他的方法吗?我发送的信息很少,但我的ajax请求确实需要171个字节,对于发送这么少的信息来说,这是很多的。 - user1431627
显示剩余4条评论
3个回答

6

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

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


这只适用于POST请求,但你可以在查询字符串中使用GET请求发送数据。 - Simon

0

你可以通过GET方式发送数据。

例如:

name=john&name=lea

这是一个简单的脚本,它向服务器发送迭代次数,并使用SSE返回进度。
该项目由两个文件(index.php和ssedemo.php)组成。 index.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>

updateProgress

    function updateProgress() {
        var input = $('#progVal').val();
        var evtSource = new EventSource("ssedemo.php?duration=" + encodeURIComponent(input));
        evtSource.addEventListener("progress", function (e) {
            var obj = JSON.parse(e.data);
            $('#container').html(obj.progress);
            if(  parseInt(obj.progress) == 100){
                evtSource.close();
            }
        }, false);
    }

这个函数使用jQuery获取文本框的内容,然后创建一个eventSource。EventSource()构造函数需要一个或两个参数。第一个参数指定要连接的URL。第二个参数以EventSourceInit字典的形式指定设置(如果有的话)。

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

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

在服务器端,您必须根据W3C建议设置标头类型并禁用缓存。

header("Content-Type: text/event-stream");
header("Cache-Control: no-cache");

然后您可以像往常一样使用 $_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();
}

如果你想发送数组,可以参考this


0

EventSource API不支持POST方法,但这并不意味着您不能使用POST与SSE。只是您不能使用EventSource API。 然而,有替代实现的方案。一个例子是sse.js,它允许您指定有效载荷,并且如果需要,还可以添加头信息。sse.js应该是EventSource的即插即用替代品,例如:

var source = new SSE("get_message.php");
source.onmessage=function(event)
{
    document.getElementById("message-window").innerHTML+=event.data + "<br>";
};

使用POST方法,您只需要指定负载即可,例如:


var source = new SSE("get_message.php", {payload: 'Hello World'});

而且,由于它是一个完全兼容的 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>";
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接