我使用Symfony的StreamedResponse实现了Server Sent Event(SSE)。当事件发生时,消息将保存在会话中,并通知用户。
问题是当包含客户端代码的页面被执行时,它会阻塞应用程序的所有Web请求,直到SSE连接由于最大执行时间而关闭。
服务器端代码:
我想知道这是否是一个良好的 SSE 实现,并且如何使 SSE 调用不阻塞请求。
我正在使用 Symfony 2.6 和 Firefox 浏览器。
感谢您的帮助。
服务器端代码:
public function notificationAction() {
$response = new StreamedResponse(function() {
while(true) {
$message = "";
$messagesNotification = $this->get('session')->getFlashBag()->get('message_notification');; // code that search notifications from session
if(count($messagesNotification)>0){
foreach ( $messagesNotification as $messageNotification ) {
$message .= "data: " . messageNotification . PHP_EOL;
}
$message .= PHP_EOL;
echo $message;
ob_flush();
flush();
}
sleep(8);
};
});
$response->headers->set('Content-Type', 'text/event-stream');
$response->headers->set('Cache-Control', 'no-cache');
return $response;
}
客户端代码:
<script>
var path = '/path';
var source = new EventSource(path);
source.onmessage = function(e) {
// notification html
};
source.onerror = function(e) {
// notification html
};
</script>
我想知道这是否是一个良好的 SSE 实现,并且如何使 SSE 调用不阻塞请求。
我正在使用 Symfony 2.6 和 Firefox 浏览器。
感谢您的帮助。
session_write_close()
的方法吗?(例如,请参见https://dev59.com/tIzda4cB1Zd3GeqPhAnE#30878764) - Darren Cook