大家好呀,我是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 服务器应放置在负载平衡器后面,该负载平衡器在服务器之间均匀分配传入请求。