我是服务器端事件的新手,并在服务器端使用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脚本会这样做)?
答案 0 :(得分:1)
PHP会话变量作为cookie发送;如果您使用Firebug(或同等版本)查看JavaScript版本,您应该会看到cookie被发送到SSE服务器脚本。
因此,您需要为Python脚本设置会话,并将其发送到cookie中。
您可以通过在PHP脚本中添加一些错误处理来确认这个猜测:
...
if (isset($_SESSION["data"])){
//current code here
}else{
sendMsg(time(), "Error: no session");
}