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

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

off999 2025-03-19 01:02 36 浏览 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-fire 快速构建 CLI_如何搭建python项目架构

命令行应用程序是开发人员最好的朋友。想快速完成某事?只需敲击几下键盘,您就已经拥有了想要的东西。Python是许多开发人员在需要快速组合某些东西时选择的第一语言。但是我们拼凑起来的东西在大多数时候并...

Python 闭包:从底层逻辑到实战避坑,附安全防护指南

一、闭包到底是什么?你可以把闭包理解成一个"带记忆的函数"。它诞生时会悄悄记下自己周围的变量,哪怕跑到别的地方执行,这些"记忆"也不会丢失。就像有人出门时总会带上...

使用Python实现九九乘法表的打印_用python打印一个九九乘法表

任务要求九九乘法表的结构如下:1×1=11×2=22×2=41×3=32×3=63×3=9...1×9=92×9=18...9×9=81使用Python编写程序,按照上述格式打印出完整的九...

吊打面试官(四)--Java语法基础运算符一文全掌握

简介本文介绍了Java运算符相关知识,包含运算规则,运算符使用经验,特殊运算符注意事项等,全文5400字。熟悉了这些内容,在运算符这块就可以吊打面试官了。Java运算符的规则与特性1.贪心规则(Ma...

Python三目运算基础与进阶_python三目运算符判断三个变量

#头条创作挑战赛#Python中你学会了三步运算,你将会省去很多无用的代码,我接下来由基础到进阶的方式讲解Python三目运算基础在Python中,三目运算符也称为条件表达式。它可以通过一行代码实现条...

Python 中 必须掌握的 20 个核心函数——set()详解

set()是Python中用于创建集合的核心函数,集合是一种无序、不重复元素的容器,非常适合用于成员检测、去重和数学集合运算。一、set()的基本用法1.1创建空集合#创建空集合empty_se...

15个让Python编码效率翻倍的实用技巧

在软件开发领域,代码质量往往比代码数量更重要。本文整理的15个Python编码技巧,源自开发者在真实项目中验证过的工作方法,能够帮助您用更简洁的代码实现更清晰的逻辑。这些技巧覆盖基础语法优化到高级特性...

《Python从小白到入门》自学课程目录汇总(和猫妹学Python)

小朋友们好,大朋友们好!不知不觉,这套猫妹自学Python基础课程已经结束了,猫妹体会到了水滴石穿的力量。水一直向下滴,时间长了能把石头滴穿。只要坚持不懈,细微之力也能做出很难办的事。就比如咱们的学习...

8÷2(2+2) 等于1还是16?国外网友为这道小学数学题吵疯了……

近日,国外网友因为一道小学数学题在推特上争得热火朝天。事情的起因是一个推特网友@pjmdoll发布了一条推文,让他的关注者解答一道数学题:Viralmathequationshavebeen...

Python学不会来打我(21)python表达式知识点汇总

在Python中,表达式是由变量、运算符、函数调用等组合而成的语句,用于产生值或执行特定操作。以下是对Python中常见表达式的详细讲解:1.1算术表达式涉及数学运算的表达式。例如:a=5b...

Python运算符:数学助手,轻松拿咧

Python中的运算符就像是生活中的数学助手,帮助我们快速准确地完成这些计算。比如购物时计算总价、做家务时分配任务等。这篇文章就来详细聊聊Python中的各种运算符,并通过实际代码示例帮助你更好地理解...

Python学不会来打我(17)逻辑运算符的使用方法与使用场景

在Python编程中,逻辑运算符(LogicalOperators)是用于组合多个条件表达式的关键工具。它们可以将多个布尔表达式连接起来,形成更复杂的判断逻辑,并返回一个布尔值(True或Fa...

Python编程基础:运算符的优先级_python中的运算符优先级问题

多个运算符同时出现在一个表达式中时,先执行哪个,后执行哪个,这就涉及运算符的优先级。如数学表达式,有+、-、×、÷、()等,优先级顺序是()、×、÷、+、-,如5+(5-3)×4÷2,先计算(5-3)...

Python运算符与表达式_python中运算符&的功能

一、运算符分类总览1.Python运算符全景图2.运算符优先级表表1.3.1Python运算符优先级(从高到低)优先级运算符描述结合性1**指数右→左2~+-位非/一元加减右→左3*//...

Python操作Excel:从基础到高级的深度实践

Python凭借其丰富的库生态系统,已成为自动化处理Excel数据的强大工具。本文将深入探讨五个关键领域,通过实际代码示例展示如何利用Python进行高效的Excel操作,涵盖数据处理、格式控制、可视...

取消回复欢迎 发表评论: