使用sseclient在Python中读取服务器端事件

时间:2015-06-22 17:15:13

标签: php python server-sent-events

我是服务器端事件的新手,并在服务器端使用PHP启动了一些测试,在客户端使用sseclient库启动了一些测试。

使用非常基本的PHP脚本,基于w3schools tutorial,我可以看到Python中收到的数据:

<?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();
}


$time = date('r');
// echo "data: The server time is: {$time}\n\n";
// flush();
sendMsg(time(),"The server time is: {$time}\n\n");


?>

并在Python中:

#!/usr/bin/env python
from sseclient import SSEClient

messages = SSEClient('http://pathto/myscript.php')
for msg in messages:
    print msg

作为第二步,我尝试从存储在$_SESSION变量中的数组中发送数据。当我在浏览器中从javascript连接到SSE流时,这似乎有效,但它不起作用,我不知道为什么。

这是我的基本PHP脚本:

<?php

session_start();

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();
}

// check for session data
if (isset($_SESSION["data"])){

    #as long there are elements in the data array, stream one at a time, clearing the array (FIFO)
    while(count($_SESSION["data"]) > 0){

        $serverTime = time();
        $data = array_shift($_SESSION["data"]);
        sendMsg($serverTime,$data);

    }
}

?>

和Python脚本是一样的。

为什么sseclient Python脚本没有从上面的PHP脚本中获取事件(而基本的JS脚本会这样做)?

1 个答案:

答案 0 :(得分:1)

PHP会话变量作为cookie发送;如果您使用Firebug(或同等版本)查看JavaScript版本,您应该会看到cookie被发送到SSE服务器脚本。

因此,您需要为Python脚本设置会话,并将其发送到cookie中。

您可以通过在PHP脚本中添加一些错误处理来确认这个猜测:

...
if (isset($_SESSION["data"])){
   //current code here
}else{
   sendMsg(time(), "Error: no session");
}