Laravel 的 SSE 为什么没有成功呢?

我想用SSE代替socket.io实现论坛提醒效果。
这里做测试我把这个文件放在public文件夹里面

//demo.sse.php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');

$time = date('r');
echo "data: The server time is: {$time}\n\n";
flush();

前台js代码:

    var source;
    function init() {
        source = new EventSource('http://blog.local/
demo_sse.php');

        source.onopen = function () {
            console.log("连接已经建立",this.readyState);
        }

        source.onmessage = function (event) {
            ev = document.getElementById('result');
            ev.innerHTML += "<br>[in] " + event.data;
            console.log("成功",event.data)
        }

        source.onerror = function (event) {
            console.log("失败",event);
        }
    }
    init();

这样是可以打印出服务器的时间信息的,但是onerror还是会报错。

假如我是在路由里面写这样一段代码呢,就不行,状态是200,函数一直报错,不会打印出服务器时间。
而且我感觉这个flush()的地方好像不对,是不是要弄一个前置中间件?我发现当浏览器去访问这个的时候,有一段缓冲时间,好像是pending状态,而上面的那种就没有。

Route::get('/sse', function () {
    $header = array(
        'Content-Type' => 'text/event-stream',
        'Cache-Control' => 'no-cache'
    );

    flush();
    return response("data: Time".date(' H:i:s'), 200, $header);
});
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 1

"data: Time".date('H:i:s').PHP_EOL.PHP_EOL 需要两个 PHP_EOL

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!