使用 Server-Sent-Events 和 Laravel 进行实时性状态更新

阅读时长 6 分钟读完

前端的实时性状态更新是一个常见的需求,比如聊天室、股票行情等。在这些场景中,通常需要将后端的数据实时地推送给前端。本文将介绍如何使用 Server-Sent-Events (SSE) 和 Laravel 框架实现实时性状态更新。

Server-Sent-Events 简介

Server-Sent-Events 是一种服务器向客户端推送事件流的技术。它是基于 HTTP 协议的一种实时性解决方案,可以用于实时性通知、实时性状态更新等场景。与 WebSocket 相比,SSE 更适合一些比较简单的场景,因为它可以使用普通的 HTTP 协议完成数据交换,不需要额外的握手过程。

SSE 采用了一种基于文本的消息传输格式,即 text/event-stream。对于每一个事件,都有一个包含事件类型和事件数据的消息。

SSE 的基本用法如下所示:

-- -------------------- ---- -------
--------- -----
------
------
    ------------------------- ----------
-------
------
    --- -----------------------
    --------
        --- ----------- - --- -----------------------

        --------------------- - --------------- -
            --- ------- - -----------------------
            --- -- - -----------------------------
            -------------- - ----------------
            --------------------------------------------------------
        --
    ---------
-------
-------

在这个示例中,我们向 /stream 发送一个 SSE,然后在前端通过 EventSource 进行监听。当服务器有新的消息到来时,浏览器会自动将消息推送给前端。在本文以后的内容中,我们将使用 Laravel 框架实现这个 SSE 服务端。

Laravel SSE 实现

Laravel 框架内置了 Illuminate\Http\Response\SSEStream 类,可以轻松实现 SSE 服务端。我们可以使用 SSEStream 类返回 text/event-stream 响应,并将事件消息推送给前端。下面是一个 SSE 示例:

-- -------------------- ---- -------
------------------ -------- -- -
    --------- - --- ----------------------------
    --------------------------------- ---------------------
    ---------------------------------- ------------

    ------ - ----------
    ----- - ---------------------- -- ------ --------

    ----------------------------- ------------- ------------

    ------ ----------
---

在这个示例中,我们向 /sse 发送 SSE,包含了一个类型为 message 的事件,和事件数据 {"content": "Hello SSE!"}。前端监听 message 事件后,可以获取到事件数据并进行处理。

注意,我们在 SSE 的响应头中添加了 Cache-Control: no-cache,这是为了告诉浏览器不要缓存 SSE 响应。

Laravel SSE 实时状态更新

实时状态更新是 SSE 的一个实际应用场景。比如,我们有一个任务计时器,需要实时地将任务剩余时间推送给前端进行显示。在 Laravel 中,我们可以使用 Artisan 命令来实现任务计时器,并通过 SSE 实时地向前端推送任务剩余时间。

下面是一个简单的任务计时器的代码:

-- -------------------- ---- -------
------------------------- -------- -- -
    ------ - -------

    ----- ------ -
        ----- - ------- -- ------ - --------
        --------------------------------

        ---------
    -
----------------- --------

在这个代码中,我们使用了一个死循环来实现计时器,每秒钟发送一次任务状态。注意,我们使用 this->info() 方法来输出信息到控制台。

接下来,我们需要将计时器的输出发送给前端。我们可以使用 SSEStream 类来实现,代码如下所示:

-- -------------------- ---- -------
-------------------- -------- -- -
    --------- - --- ----------------------------
    --------------------------------- ---------------------
    ---------------------------------- ------------

    ----- ------ -
        ----- - ------- -- ------ - --------
        ------ - ---------
        -------- - -------------------

        ----------------------------- ------------- ---------------
        ------------------

        ---------
    -

    ------ ----------
---

在这个代码中,我们在死循环中不断地生成新的 SSE 消息,并使用 $response->send() 方法将消息推送给前端。前端可以通过监听 update 事件获取到任务状态,并进行显示。

现在,我们已经完成了一个基本的 SSE 实时状态更新的应用了。在实际应用场景中,可能还需要更复杂的实现方案,比如存储任务状态、提供状态查询等等,但这已经超出了本文的范围。

总结

本文介绍了如何使用 Server-Sent-Events 和 Laravel 框架实现实时性状态更新。使用 SSE 可以避免 WebSocket 握手等额外的开销,在一些简单的场景下可以提高开发效率和性能。SSE 还有很多其它的应用场景,比如服务器监控、消息通知等等,希望本文能够为读者带来一些启示。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6522f8f395b1f8cacda6a1b4

纠错
反馈