duanmianxue2687
2015-06-22 17:15
浏览 426
已采纳

使用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) ?

图片转代码服务由CSDN问答提供 功能建议

我是Server Side Events的新手,在服务器端用PHP启动了一些测试,在客户端用Python启动了一些测试 使用 sseclient 库。

使用 一个非常基本的PHP脚本,基于 w3schools教程我可以看到收到的数据 Python:

 &lt;?php 
 
header('Content-Type:text / event-stream'); 
header('Cache-Control:no-cache'  ); 
 
函数sendMsg($ id,$ msg){
 echo“id:$ id”。  PHP_EOL; 
 echo“data:$ msg”。  PHP_EOL; 
 echo PHP_EOL; 
 ob_flush(); 
 flush(); 
} 
 
 
 $ time = date('r'); 
 // echo“data:服务器时间是 :{$ time} 
 
“; 
 // flush(); 
sendMsg(time(),”服务器时间为:{$ time} 
 
“); 
 
 
?  &gt; 
   
 
 

在Python中:

 #!/ usr / bin / env python 
 from sseclient import  SSEClient 
 
消息= SSEClient('http://pathto/myscript.php')
对于消息中的消息:
 print msg 
   
 
 

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

这是我的基本PHP脚本:

 &lt;?php 
 
session_start(); 
 
header('Content-Type:text / event-stream'); 
header('Cache-Control:no  -cache'); 
 
函数sendMsg($ id,$ msg){
 echo“id:$ id”。  PHP_EOL; 
 echo“data:$ msg”。  PHP_EOL; 
 echo PHP_EOL; 
 ob_flush(); 
 flush(); 
} 
 
 //检查会话数据
if(isset($ _ SESSION [“data”])){
 \  n #as long数据数组中有元素,一次流一个,清除数组(FIFO)
 while(count($ _ SESSION [“data”])&gt; 0){
 
 $ serverTime =  time(); 
 $ data = array_shift($ _ SESSION [“data”]); 
 sendMsg($ serverTime,$ data); 
 
} 
} 
 
?&gt; 
   
 
 

并且Python脚本是相同的。

为什么sseclient Python脚本没有从上面的PHP脚本中获取事件( 虽然基本的JS一个)?

  • 写回答
  • 好问题 提建议
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • dsd119120 2015-06-22 21:25
    已采纳

    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");
    }
    
    已采纳该答案
    评论
    解决 无用
    打赏 举报

相关推荐 更多相似问题