duanmianxue2687
duanmianxue2687
2015-06-22 17:15

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

已采纳

I'm new to Server Side Events and started some tests with PHP on the server side and Python on the client side using the sseclient library.

Using a very basic PHP script, based on the w3schools tutorial I can see the data being received in 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}

";
// flush();
sendMsg(time(),"The server time is: {$time}

");


?>

and in Python:

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

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

As a second step I've tried sending data read from an array stored in the $_SESSION variable. This seems to work when I connect to the SSE stream from javascript in the browser, but it doesn't work and I'm not sure why.

Here's my basic PHP script:

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

    }
}

?>

and the Python script is the same.

Why isn't the sseclient Python script picking up the events from the above PHP script (while a basic JS one does) ?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

1条回答

  • dsd119120 dsd119120 6年前

    The PHP session variable is sent as a cookie; if you view your JavaScript version with Firebug (or equivalent) you should see the cookie being sent to the SSE server script.

    So you'll need to set up a session for the Python script, and have it send that in a cookie too.

    You could confirm this guess by adding some error handling to your PHP script:

    ...
    if (isset($_SESSION["data"])){
       //current code here
    }else{
       sendMsg(time(), "Error: no session");
    }
    
    点赞 评论 复制链接分享