搜索
首页php框架Laravel一文详解Laravel怎么快速创建简单事件流

本篇文章给大家带来了关于Laravel 事件流的相关知识,其中主要介绍了什么是事件流,又如何在 Laravel 中创建一个简单的事件流,感兴趣的朋友一起来看一下吧,希望对大家有帮助。

简介

事件流为你提供了一种将事件发送到客户端而无需重新加载页面的方法。当对数据库进行实时更改时,这对于更新用户界面非常有用。

与使用 AJAX 请求的传统长轮询不同,在传统轮询中,多个请求被发送到服务器,每次都建立新的连接,事件流在单个请求中实时发送到客户端。

e4e36fd65aa3addf1b5fbea64d95abf.jpg

在本文中,我将向你展示如何在 Laravel 中创建一个简单的事件流。

先决条件

在开始之前,你需要在机器上安装 Laravel。

我将在这个演示中使用 DigitalOcean Ubuntu Droplet 。如果你愿意,你可以使用我的会员代码获得免费 $100 DigitalOcean 积分来启动你自己的服务器!

如果你还没有,可以按照本教程中的步骤进行操作:

或者可以使用这个很棒的脚本进行安装:

创建一个 Controller

让我们从创建一个处理事件流的控制器开始。

使用以下命令:

php artisan make:controller EventStreamController

这将在 App\Http\Controllers 目录中创建一个新控制器。

添加事件流方法

一旦我们创建了我们的控制器,我们需要向它添加 stream 方法。 该方法将用于发送事件流。

打开 EventStreamController.php 文件并添加以下代码:

<?php

namespace App\Http\Controllers;use Carbon\Carbon;use App\Models\Trade;class StreamsController extends Controller{
    /**
     * 事件流代码
     *
     * @return \Illuminate\Http\Response
     */
    public function stream(){
        return response()->stream(function () {
            while (true) {
                echo "event: ping\n";
                $curDate = date(DATE_ISO8601);
                echo 'data: {"time": "' . $curDate . '"}';
                echo "\n\n";

                $trades = Trade::latest()->get();
                echo 'data: {"total_trades":' . $trades->count() . '}' . "\n\n";

                $latestTrades = Trade::with('user', 'stock')->latest()->first();
                if ($latestTrades) {
                    echo 'data: {"latest_trade_user":"' . $latestTrades->user->name . '", "latest_trade_stock":"' . $latestTrades->stock->symbol . '", "latest_trade_volume":"' . $latestTrades->volume . '", "latest_trade_price":"' . $latestTrades->stock->price . '", "latest_trade_type":"' . $latestTrades->type . '"}' . "\n\n";
                }

                ob_flush();
                flush();

                // 如果客户端中止连接,则中断循环(关闭页面)
                if (connection_aborted()) {break;}
                usleep(50000); // 50ms
            }
        }, 200, [
            'Cache-Control' => 'no-cache',
            'Content-Type' => 'text/event-stream',
        ]);
    }}

这里要注意的主要事项是:

  • 我们使用 response()->stream() 方法来创建事件流。
  • 然后我们有一个无限循环,每隔50ms发送一次事件流。
  • 如果客户端中止连接,我们使用 ob_flush()flush() 来发送事件流。
  • 我们使用 sleep() 发送下一个事件之前等待50ms。
  • 我们使用 connection_aborted() 来中断循环,如果客户端中止了连接。
  • 我们使用 Carbon\Carbon 类获取当前日期。
  • 我们使用 App\Models\Trade 模型获取最新交易。这仅用于演示,你可以使用任何你想要的模型。
  • Content-Type 标头设置为 text/event-stream 以告知浏览器响应是事件流。

启用输出缓冲

为了使上述代码正常工作,我们需要在你的 PHP.ini 文件中启用输出缓冲。 这是通过将以下行添加到 php.ini 文件中完成的:

output_buffering = On

进行此更改后,可能需要重新加载 PHP-FPM 服务。 或者如果你使用的是 Apache,则可以重新启动 Apache。

添加路由

当请求 /stream 路由时,我们想调用 ``stream` 方法。

路由将被添加到routes/web.php 文件中,如下所示:

use App\Http\Controllers\StreamsController;Route::get('/stream', [StreamsController::class, 'stream']);

使用前端的事件流

你可以使用 Vue.js 之类的前端框架来处理事件流。 但是对于这个演示,我将使用纯 Javascript。

添加到 blade 模板中的 JavaScript 片段如下所示:

const eventSource = new EventSource('/stream');eventSource.onmessage = function(event) {
    const data = JSON.parse(event.data);
    if (data.time) {
        document.getElementById('time').innerHTML = data.time;
    }
    const newElement = document.createElement("li");
    const eventList = document.getElementById("list");

    newElement.textContent = "message: " + event.data;
    eventList.appendChild(newElement);}

要查看此操作,你可以尝试以下演示!【相关推荐:laravel视频教程

演示项目

如果你想了解事件流是如何工作的,可以查看我创建的演示项目:

Laravel EventStream:使用 Laravel 和 Materialize 进行实时股票交易仪表板

演示项目不仅显示事件流,还具有简单的前端仪表板,并使用 Materialize 作为流数据库。

Laravel EventStream

SSE vs WebSockets

事件流很棒且易于使用,但与 WebSockets 等其他流协议相比,它也有一些优点和缺点。

例如,SSE 是单向的,这意味着一旦建立连接,服务器只会向客户端发送数据,而客户端不能将数据发送回服务器。

与长轮询不同,使用 WebSockets,你只有一个与服务器的连接,类似于 SSE(服务器发送事件)。 连接是双工的,这意味着你可以从服务器发送和接收数据。

如果想了解有关 SSE 和 WebSockets 之间差异的更多信息,请观看 Martin Chaov 的精彩视频:链接

结论

有关事件流的更多信息,请在此处查看 Mozilla 的此文档:

在那里,你会找到对事件流及其工作方式的更深入的解释。

有关 Materialise 的更多信息,请在此处观看此视频:链接

希望你喜欢这个教程!

原文地址:https://devdojo.com/bobbyiliev/how-to-cr...

译文地址:https://www.php.cn/link/09d45b92ec72b3c16ac64bbe4b97f539

以上是一文详解Laravel怎么快速创建简单事件流的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文转载于:learnku。如有侵权,请联系admin@php.cn删除
Laravel的影响:简化网络开发Laravel的影响:简化网络开发Apr 21, 2025 am 12:18 AM

Laravel通过简化Web开发过程和提供强大功能脱颖而出。其优势包括:1)简洁的语法和强大的ORM系统,2)高效的路由和认证系统,3)丰富的第三方库支持,使得开发者能专注于编写优雅的代码并提高开发效率。

Laravel:前端还是后端?澄清框架的角色Laravel:前端还是后端?澄清框架的角色Apr 21, 2025 am 12:17 AM

laravelispredminandermanthandermanthandermanthandermanthermanderframework,设计Forserver-SideLogic,databasemagement,andapideplupment,thryitalsosupportsfortfortsfrontenddevelopmentwithbladeTemplates。

Laravel vs. Python:探索性能和可扩展性Laravel vs. Python:探索性能和可扩展性Apr 21, 2025 am 12:16 AM

Laravel和Python在性能和可扩展性方面的表现各有优劣。Laravel通过异步处理和队列系统提升性能,但受PHP限制在高并发时可能有瓶颈;Python利用异步框架和强大的库生态系统表现出色,但在多线程环境下受GIL影响。

Laravel vs. Python(与框架):比较分析Laravel vs. Python(与框架):比较分析Apr 21, 2025 am 12:15 AM

Laravel适合团队熟悉PHP且需功能丰富的项目,Python框架则视项目需求而定。1.Laravel提供优雅语法和丰富功能,适合需要快速开发和灵活性的项目。2.Django适合复杂应用,因其“电池包含”理念。3.Flask适用于快速原型和小型项目,提供极大灵活性。

Laravel的前端:探索可能性Laravel的前端:探索可能性Apr 20, 2025 am 12:19 AM

Laravel可以用于前端开发。1)使用Blade模板引擎生成HTML。2)集成Vite管理前端资源。3)构建SPA、PWA或静态网站。4)结合路由、中间件和EloquentORM创建完整Web应用。

PHP和Laravel:构建服务器端应用程序PHP和Laravel:构建服务器端应用程序Apr 20, 2025 am 12:17 AM

PHP和Laravel可用于构建高效的服务器端应用。1.PHP是开源脚本语言,适用于Web开发。2.Laravel提供路由、控制器、EloquentORM、Blade模板引擎等功能,简化开发。3.通过缓存、代码优化和安全措施,提升应用性能和安全性。4.测试和部署策略确保应用稳定运行。

Laravel vs. Python:学习曲线和易用性Laravel vs. Python:学习曲线和易用性Apr 20, 2025 am 12:17 AM

Laravel和Python在学习曲线和易用性上的表现各有优劣。Laravel适合快速开发Web应用,学习曲线相对平缓,但掌握高级功能需时间;Python语法简洁,学习曲线平缓,但动态类型系统需谨慎。

Laravel的优势:后端发展Laravel的优势:后端发展Apr 20, 2025 am 12:16 AM

Laravel在后端开发中的优势包括:1)优雅的语法和EloquentORM简化了开发流程;2)丰富的生态系统和活跃的社区支持;3)提高了开发效率和代码质量。Laravel的设计让开发者能够更高效地进行开发,并通过其强大的功能和工具提升代码质量。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

mPDF

mPDF

mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),