Reading Server Side Events in Python using sseclient

1.8k views Asked by At

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}\n\n";
// flush();
sendMsg(time(),"The server time is: {$time}\n\n");


?>

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

There are 1 answers

2
Darren Cook On BEST ANSWER

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