POST 到 PHP 与服务器发送的事件?

Posted

技术标签:

【中文标题】POST 到 PHP 与服务器发送的事件?【英文标题】:POST to PHP with server sent events? 【发布时间】:2012-09-08 00:58:19 【问题描述】:

是否可以像在 Ajax 中一样使用 SSE 向 php 发送 POST 数据?

我已经使用 AJAX 很长一段时间了,但在长轮询技术中效果不佳。我也一直在想WebSockets,不过好像有点多余。

【问题讨论】:

SSE 是为单向推送而设计的,而不是双向通信 - 对于这种情况,Web Sockets 可能更合适 node.js 怎么样,nodejs.org @tomfumb 我只 POST 2 个字节的数据 这无关紧要;据我所知(受限于 SSE 没有很好的文档记录)从客户端到服务器的唯一通信是在启动连接时。一旦链接建立(或在失败的情况下重新建立),数据只会以一种方式流动。 还可以看到我曾经提出的一个问题,强调 PHP 在 SSE 方面的不足:***.com/questions/9070995/… 【参考方案1】:

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

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

【讨论】:

这仅适用于 POST,但您可以在查询字符串中使用 GET 发送数据。【参考方案2】:

您可以通过 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>

更新进度

    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 recommendation设置header类型和禁用缓存

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

【讨论】:

欢迎来到 Stack Overflow!虽然这在理论上可以回答这个问题,it would be preferable 在此处包含答案的基本部分,并提供链接以供参考。【参考方案3】:

EventSource API 不支持 POST 方法,但这并不意味着您不能将 SSE 与 POST 一起使用。您只是不能使用 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>";
;

【讨论】:

以上是关于POST 到 PHP 与服务器发送的事件?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Fetch API 将数据发送到 PHP 服务器(首选 POST 方法和 JSON)

如何向php服务器发送数据为json的post请求

PayPal Webhook 不发送 POST 数据

无法使用 Postman 将 POST 变量发送到 localhost 上的 php 脚本

jQuery 与 JSON

如何获取(收听)POST 和 GET 方法发送到我的服务器 PHP