如何使用PHP在POST上发送Sever Sent Events?

时间:2015-06-19 18:05:19

标签: php post server-sent-events

我刚开始使用PHP和Server Sent Events。 在查看了几篇文章之后,比如W3CHTML5Rocks,我能够非常快速地获得一些内容。

我现在要做的是在我的php脚本收到POST时发送Server Sent事件。这是我天真的尝试:

<?php

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

function sendMsg($id, $msg) {
  echo "id: $id" . PHP_EOL;
  echo "data: $msg" . PHP_EOL;
  echo PHP_EOL;
  ob_flush();
  flush();
}

$method = $_SERVER['REQUEST_METHOD'];

if ($method == 'POST') {

    $serverTime = time();
    $data = file_get_contents("php://input");

    sendMsg($serverTime,$data);

}

?>

这似乎不起作用,但我找不到原因。 我看不到任何错误并使用JS我可以看到客户端可以连接, 但是在执行POST操作时没有数据通过。

当服务器收到POST时,建议发送Server Sent Event的方法是什么?

1 个答案:

答案 0 :(得分:1)

我将直接引用my SSE book,第9章,“带有SSE的HTTP POST”部分:

  

如果您购买本书只是为了学习如何将变量发布到SSE   后端,你直接转到这一部分,我想你   深吸一口气,确保你坐下。你看,我   有一些坏消息。 ...... SSE标准无法允许你   POST数据到服务器。这是一个非常烦人的疏忽,......

另一种方法是回到前SSE替代方案(因为imagemin-jpeg-recompress,即AJAX,允许POST);这本书的内容非常详细。

实际上,还有另外一种解决方法,考虑到您使用的PHP实际上相当容易:首先将数据发布到另一个脚本,使用它将您的POST数据存储在XMLHttpRequest中,然后使用您的SSE脚本从$_SESSION中获取。 (这听起来并不像听起来那么难看:SSE进程将会长时间运行,因此可以接受一次额外的http调用来设置它。)