Symfony StreamedResponse 服务器发送事件阻止请求

标签 symfony server-sent-events

我在 Symfony 中使用 StreamedResponse 实现了服务器发送事件 (SSE)。因此,当事件发生时, session 中会保存一条消息,该消息将通知给用户。 问题是,当执行包含客户端代码的页面时,它会阻止对应用程序的所有 Web 请求,直到 SSE 连接由于最大执行时间而关闭。

服务器端代码:

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 作为浏览器。

预先感谢您的帮助。

最佳答案

您隐式使用 $this->get('session')

session_start() 将锁定 session 的文件(如果您使用 native 文件 session 处理程序,默认情况下)直到你用

编写它
$this->get('session')->save()

只有这样文件才会被解锁。尝试在 sleep(8); 上面使用它。

关于Symfony StreamedResponse 服务器发送事件阻止请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33351643/

相关文章:

php - 全局日志服务

symfony - Doctrine 实体管理器实例

javascript - fetch-api 请求(GET 和 POST)失败。我迷路了

php - 实时接收 php 中的 mysql 更新

javascript - 监听来自服务器、Chrome 扩展程序的事件

javascript - 在客户端处理大数据集

symfony - 如何从 Symfony2 请求对象中删除单个参数

symfony - 如何在没有 Composer 的情况下安装供应商 bundle (企业网络)

html - Firefox Shared Web Workers 中的服务器发送事件

php - Symfony - DateTime 类的对象无法转换为字符串