目录
简介
先决条件
创建一个 Controller
添加事件流方法
启用输出缓冲
添加路由
使用前端的事件流
演示项目
SSE vs WebSockets
结论
首页 php框架 Laravel 一文详解Laravel怎么快速创建简单事件流

一文详解Laravel怎么快速创建简单事件流

Jan 04, 2023 pm 04:07 PM
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中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热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

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

在Laravel中如何获取邮件发送失败时的退信代码? 在Laravel中如何获取邮件发送失败时的退信代码? Apr 01, 2025 pm 02:45 PM

Laravel邮件发送失败时的退信代码获取方法在使用Laravel开发应用时,经常会遇到需要发送验证码的情况。而在实�...

Laravel计划任务不执行:schedule:run命令后任务未运行怎么办? Laravel计划任务不执行:schedule:run命令后任务未运行怎么办? Mar 31, 2025 pm 11:24 PM

Laravel计划任务运行无响应排查在使用Laravel的计划任务调度时,不少开发者会遇到这样的问题:schedule:run...

在 Laravel 中,如何处理邮件发送验证码失败的情况? 在 Laravel 中,如何处理邮件发送验证码失败的情况? Mar 31, 2025 pm 11:48 PM

Laravel邮件发送验证码失败时的处理方法在使用Laravel...

在dcat admin中如何实现点击添加数据的自定义表格功能? 在dcat admin中如何实现点击添加数据的自定义表格功能? Apr 01, 2025 am 07:09 AM

在dcatadmin(laravel-admin)中如何实现自定义点击添加数据的表格功能在使用dcat...

Laravel Redis连接共享:为何select方法会影响其他连接? Laravel Redis连接共享:为何select方法会影响其他连接? Apr 01, 2025 am 07:45 AM

Laravel框架中Redis连接的共享与select方法的影响在使用Laravel框架和Redis时,开发者可能会遇到一个问题:通过配置...

Laravel多租户扩展stancl/tenancy:如何自定义租户数据库连接的主机地址? Laravel多租户扩展stancl/tenancy:如何自定义租户数据库连接的主机地址? Apr 01, 2025 am 09:09 AM

在Laravel多租户扩展包stancl/tenancy中自定义租户数据库连接使用Laravel多租户扩展包stancl/tenancy构建多租户应用时,...

Bangla 部分模型检索中的 Laravel Eloquent ORM) Bangla 部分模型检索中的 Laravel Eloquent ORM) Apr 08, 2025 pm 02:06 PM

LaravelEloquent模型检索:轻松获取数据库数据EloquentORM提供了简洁易懂的方式来操作数据库。本文将详细介绍各种Eloquent模型检索技巧,助您高效地从数据库中获取数据。1.获取所有记录使用all()方法可以获取数据库表中的所有记录:useApp\Models\Post;$posts=Post::all();这将返回一个集合(Collection)。您可以使用foreach循环或其他集合方法访问数据:foreach($postsas$post){echo$post->

Laravel的地理空间:互动图和大量数据的优化 Laravel的地理空间:互动图和大量数据的优化 Apr 08, 2025 pm 12:24 PM

利用地理空间技术高效处理700万条记录并创建交互式地图本文探讨如何使用Laravel和MySQL高效处理超过700万条记录,并将其转换为可交互的地图可视化。初始挑战项目需求:利用MySQL数据库中700万条记录,提取有价值的见解。许多人首先考虑编程语言,却忽略了数据库本身:它能否满足需求?是否需要数据迁移或结构调整?MySQL能否承受如此大的数据负载?初步分析:需要确定关键过滤器和属性。经过分析,发现仅少数属性与解决方案相关。我们验证了过滤器的可行性,并设置了一些限制来优化搜索。地图搜索基于城

See all articles