百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

Laravel11 Laravel-Reverb-超快且可扩展的实时 WebSocket 通信

off999 2025-03-19 01:02 32 浏览 0 评论

大家好呀,我是yangyang.今天带来Laravel11尝鲜的新一期,如果没有看过的朋友可以先看看laravel11的重要更新《laravel11发行说明》,然后今天的主要内容是介绍laravel11中广播系统的新驱动Laravel-Reverb.

介绍

Laravel Reverb直接为您的 Laravel 应用程序带来超快且可扩展的实时 WebSocket 通信,并提供与 Laravel 现有事件广播工具套件的无缝集成。

安装

您可以使用 Artisan 命令安装 Reverb install:broadcasting:

php artisan install:broadcasting       

配置

该命令将使用一组合理的默认配置选项安装 Reverb。如果您想进行任何配置更改,可以通过更新 Reverb 的环境变量或更新config/reverb.php配置文件来完成。


申请凭证

为了建立与 Reverb 的连接,必须在客户端和服务器之间交换一组 Reverb“应用程序”凭据。这些凭据在服务器上配置,用于验证来自客户端的请求。您可以使用以下环境变量定义这些凭据:

REVERB_APP_ID=my-app-id

REVERB_APP_KEY=my-app-key

REVERB_APP_SECRET=my-app-secret
            


允许的来源

您还可以通过更新配置文件部分allowed_origins中的配置值来定义客户端请求的来源。来自未在您允许的来源中列出的来源的任何请求都将被拒绝。您可以使用以下方式允许所有来源:appsconfig/reverb.php*

'apps' => [

 [

'id' => 'my-app-id',

'allowed_origins' => ['laravel.com'],

// ...

 ]

]
            


附加应用

通常,Reverb 为其安装的应用程序提供 WebSocket 服务器。然而,可以使用单个 Reverb 安装来服务多个应用程序。

例如,您可能希望维护一个 Laravel 应用程序,该应用程序通过 Reverb 为多个应用程序提供 WebSocket 连接。这可以通过apps在应用程序的config/reverb.php配置文件中定义多个来实现:

'apps' => [

 [

'id' => 'my-app-one',

// ...

 ],

 [

'id' => 'my-app-two',

// ...

 ],

],


            

SSL协议

在大多数情况下,安全的 WebSocket 连接在请求被代理到 Reverb 服务器之前由上游 Web 服务器(Nginx 等)处理。

但是,有时(例如在本地开发期间)Reverb 服务器直接处理安全连接可能很有用。如果您正在使用Laravel Herd 的安全站点功能,或者您正在使用Laravel Valet并针对您的应用程序运行了secure 命令,您可以使用为您的站点生成的 Herd / Valet 证书来保护您的 Reverb 连接。为此,请将REVERB_HOST环境变量设置为站点的主机名或在启动 Reverb 服务器时显式传递主机名选项:

php artisan reverb:start --host="0.0.0.0" --port=8080 --hostname="laravel.test"
            


由于 Herd 和 Valet 域解析为localhost,运行上面的命令将导致您的 Reverb 服务器可通过安全 WebSocket 协议 ( wss)进行访问wss://laravel.test:8080。

tls您还可以通过在应用程序的配置文件中定义选项来手动选择证书config/reverb.php。在选项数组中,您可以提供PHP 的 SSL 上下文选项tls支持的任何选项:

'options' => [

'tls' => [

'local_cert' => '/path/to/cert.pem'

 ],

],
            


运行服务器

可以使用reverb:startArtisan 命令启动混响服务器:

php artisan reverb:start
            


默认情况下,混响服务器将在 启动0.0.0.0:8080,从而可以从所有网络接口访问它。

如果您需要指定自定义主机或端口,您可以在启动服务器时通过--host和选项来执行此操作:--port

php artisan reverb:start --host=127.0.0.1 --port=9000
            


或者,您可以在应用程序的配置文件中定义环境REVERB_SERVER_HOST变量。REVERB_SERVER_PORT.env

调试

为了提高性能,Reverb 默认情况下不输出任何调试信息。如果您想查看通过混响服务器的数据流,您可以--debug向reverb:start命令提供选项:

php artisan reverb:start --debug
            


重启

由于 Reverb 是一个长期运行的进程,因此如果不通过reverb:restartArtisan 命令重新启动服务器,对代码的更改将不会得到反映。

该reverb:restart命令确保在停止服务器之前正常终止所有连接。如果您使用进程管理器(例如 Supervisor)运行 Reverb,则在所有连接终止后,进程管理器将自动重新启动服务器:

php artisan reverb:restart
            


监控

可以通过与Laravel Pulse集成来监控混响。通过启用 Reverb 的 Pulse 集成,您可以跟踪服务器正在处理的连接和消息的数量。

要启用集成,您应该首先确保已安装 Pulse。然后,将任何 Reverb 录音机添加到应用程序的config/pulse.php配置文件中:

use Laravel\Reverb\Pulse\Recorders\ReverbConnections;

use Laravel\Reverb\Pulse\Recorders\ReverbMessages;

'recorders' => [

ReverbConnections::class => [

'sample_rate' => 1,

 ],

ReverbMessages::class => [

'sample_rate' => 1,

 ],

...

],
            

接下来,将每个记录器添加到您的仪表板:







 ...


            


在生产中运行Reverb

由于 WebSocket 服务器的长期运行特性,您可能需要对服务器和托管环境进行一些优化,以确保您的 Reverb 服务器能够有效地处理服务器上可用资源的最佳连接数。

[!注意]如果您的站点由Laravel Forge
管理,您可以直接从“应用程序”面板自动优化服务器的 Reverb。通过启用 Reverb 集成,Forge 将确保您的服务器已做好生产准备,包括安装任何所需的扩展并增加允许的连接数量。

打开文件

每个 WebSocket 连接都保存在内存中,直到客户端或服务器断开连接。在 Unix 和类 Unix 环境中,每个连接都由一个文件表示。然而,在操作系统和应用程序级别上允许打开的文件数量通常受到限制。

操作系统

在基于 Unix 的操作系统上,您可以使用以下ulimit命令确定允许的打开文件数:

ulimit -n
            


该命令将显示不同用户允许的打开文件限制。您可以通过编辑/etc/security/limits.conf文件来更新这些值。例如,将用户的最大打开文件数更新为 10,000 个,forge如下所示:

# /etc/security/limits.conf

forge soft nofile 10000

forge hard nofile 10000
            


事件循环

在底层,Reverb 使用 ReactPHP 事件循环来管理服务器上的 WebSocket 连接。默认情况下,此事件循环由 提供支持stream_select,不需要任何额外的扩展。但是,stream_select通常限制为 1,024 个打开文件。因此,如果您计划处理超过 1,000 个并发连接,则需要使用不受相同限制的替代事件循环。

如果可用,混响将自动切换到ext-event、ext-ev或ext-uv有源循环。所有这些 PHP 扩展都可以通过 PECL 安装:

pecl install event

# or

pecl install ev

# or

pecl install uv
            


网络服务器

在大多数情况下,Reverb 在服务器上的非面向 Web 的端口上运行。因此,为了将流量路由到 Reverb,您应该配置反向代理。假设 Reverb 在主机0.0.0.0和端口上运行8080,并且您的服务器使用 Nginx Web 服务器,则可以使用以下 Nginx 站点配置为您的 Reverb 服务器定义反向代理:

server {

 ...

location / {

 proxy_http_version 1.1;

 proxy_set_header Host $http_host;

 proxy_set_header Scheme $scheme;

 proxy_set_header SERVER_PORT $server_port;

 proxy_set_header REMOTE_ADDR $remote_addr;

 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

 proxy_set_header Upgrade $http_upgrade;

 proxy_set_header Connection "Upgrade";

 proxy_pass http://0.0.0.0:8080;

 }

 ...

}
            


通常,Web 服务器配置为限制允许的连接数量,以防止服务器过载。要将 Nginx Web 服务器上允许的连接数增加到 10,000,应更新文件的worker_rlimit_nofile和值:
worker_connectionsnginx.conf

user forge;

worker_processes auto;

pid /run/nginx.pid;

include /etc/nginx/modules-enabled/*.conf;

worker_rlimit_nofile 10000;

events {

 worker_connections 10000;

 multi_accept on;

}
            


上面的配置将允许每个进程最多生成 10,000 个 Nginx 工作线程。此外,此配置将 Nginx 的打开文件限制设置为 10,000。

端口范围

基于 Unix 的操作系统通常会限制服务器上可以打开的端口数量。您可以通过以下命令查看当前允许的范围:

cat /proc/sys/net/ipv4/ip_local_port_range

# 32768 60999
            

上面的输出显示服务器最多可以处理 28,231 (60,999 - 32,768) 个连接,因为每个连接都需要一个空闲端口。尽管我们建议水平扩展以增加允许的连接数,但您可以通过更新服务器配置文件中允许的端口范围来增加可用的开放端口数/etc/sysctl.conf。

守护进程

在大多数情况下,您应该使用进程管理器(例如 Supervisor)来确保 Reverb 服务器持续运行。如果您使用 Supervisor 运行 Reverb,则应更新minfds服务器supervisor.conf文件的设置,以确保 Supervisor 能够打开处理与 Reverb 服务器的连接所需的文件:

[supervisord]

...

minfds=10000
            


水平扩展

如果您需要处理的连接数量超过单个服务器允许的数量,您可以水平扩展Reverb服务器。利用 Redis 的发布/订阅功能,Reverb 能够管理跨多个服务器的连接。当应用程序的 Reverb 服务器之一收到消息时,该服务器将使用 Redis 将传入消息发布到所有其他服务器。

要启用水平扩展,您应该在应用程序的配置文件中将REVERB_SCALING_ENABLED环境变量设置为:true.env

REVERB_SCALING_ENABLED=true

接下来,您应该有一个专用的中央 Redis 服务器,所有 Reverb 服务器都将与该服务器进行通信。 Reverb 将使用为您的应用程序配置的默认 Redis 连接将消息发布到所有 Reverb 服务器。

启用 Reverb 的扩展选项并配置 Redis 服务器后,您只需在reverb:start能够与 Redis 服务器通信的多个服务器上调用该命令即可。这些 Reverb 服务器应放置在负载平衡器后面,该负载平衡器在服务器之间均匀分配传入请求。

相关推荐

Python钩子函数实现事件驱动系统(created钩子函数)

钩子函数(HookFunction)是现代软件开发中一个重要的设计模式,它允许开发者在特定事件发生时自动执行预定义的代码。在Python生态系统中,钩子函数广泛应用于框架开发、插件系统、事件处理和中...

Python函数(python函数题库及答案)

定义和基本内容def函数名(传入参数):函数体return返回值注意:参数、返回值如果不需要,可以省略。函数必须先定义后使用。参数之间使用逗号进行分割,传入的时候,按照顺序传入...

Python技能:Pathlib面向对象操作路径,比os.path更现代!

在Python编程中,文件和目录的操作是日常中不可或缺的一部分。虽然,这么久以来,钢铁老豆也还是习惯性地使用os、shutil模块的函数式API,这两个模块虽然功能强大,但在某些情况下还是显得笨重,不...

使用Python实现智能物流系统优化与路径规划

阅读文章前辛苦您点下“关注”,方便讨论和分享,为了回馈您的支持,我将每日更新优质内容。在现代物流系统中,优化运输路径和提高配送效率是至关重要的。本文将介绍如何使用Python实现智能物流系统的优化与路...

Python if 语句的系统化学习路径(python里的if语句案例)

以下是针对Pythonif语句的系统化学习路径,从零基础到灵活应用分为4个阶段,包含具体练习项目和避坑指南:一、基础认知阶段(1-2天)目标:理解条件判断的逻辑本质核心语法结构if条件:...

[Python] FastAPI基础:Path路径参数用法解析与实例

查询query参数(上一篇)路径path参数(本篇)请求体body参数(下一篇)请求头header参数本篇项目目录结构:1.路径参数路径参数是URL地址的一部分,是必填的。路径参...

Python小案例55- os模块执行文件路径

在Python中,我们可以使用os模块来执行文件路径操作。os模块提供了许多函数,用于处理文件和目录路径。获取当前工作目录(CurrentWorkingDirectory,CWD):使用os....

python:os.path - 常用路径操作模块

应该是所有程序都需要用到的路径操作,不废话,直接开始以下是常用总结,当你想做路径相关时,首先应该想到的是这个模块,并知道这个模块有哪些主要功能,获取、分割、拼接、判断、获取文件属性。1、路径获取2、路...

原来如此:Python居然有6种模块路径搜索方式

点赞、收藏、加关注,下次找我不迷路当我们使用import语句导入模块时,Python是怎么找到这些模块的呢?今天我就带大家深入了解Python的6种模块路径搜索方式。一、Python模块...

每天10分钟,python进阶(25)(python进阶视频)

首先明确学习目标,今天的目标是继续python中实例开发项目--飞机大战今天任务进行面向对象版的飞机大战开发--游戏代码整编目标:完善整串代码,提供完整游戏代码历时25天,首先要看成品,坚持才有收获i...

python 打地鼠小游戏(打地鼠python程序设计说明)

给大家分享一段AI自动生成的代码(在这个游戏中,玩家需要在有限时间内打中尽可能多的出现在地图上的地鼠),由于我现在用的这个电脑没有安装sublime或pycharm等工具,所以还没有测试,有兴趣的朋友...

python线程之十:线程 threading 最终总结

小伙伴们,到今天threading模块彻底讲完。现在全面总结threading模块1、threading模块有自己的方法详细点击【threading模块的方法】threading模块:较低级...

Python信号处理实战:使用signal模块响应系统事件

信号是操作系统用来通知进程发生了某个事件的一种异步通信方式。在Python中,标准库的signal模块提供了处理这些系统信号的机制。信号通常由外部事件触发,例如用户按下Ctrl+C、子进程终止或系统资...

Python多线程:让程序 “多线作战” 的秘密武器

一、什么是多线程?在日常生活中,我们可以一边听音乐一边浏览新闻,这就是“多任务处理”。在Python编程里,多线程同样允许程序同时执行多个任务,从而提升程序的执行效率和响应速度。不过,Python...

用python写游戏之200行代码写个数字华容道

今天来分析一个益智游戏,数字华容道。当初对这个游戏颇有印象还是在最强大脑节目上面,何猷君以几十秒就完成了这个游戏。前几天写2048的时候,又想起了这个游戏,想着来研究一下。游戏玩法用尽量少的步数,尽量...

取消回复欢迎 发表评论: