Laravel11 从0开发 Swoole-Reverb 扩展包(三) - reverb广播驱动使用流程

前情提要

我们第一节的时候,已经大致介绍reverb,他 是 Laravel 应用程序的第一方 WebSocket 服务器,可将客户端和服务器之间的实时通信直接带到您的指尖。开源且只需一个 Artisan 命令即可 - 尽在 Laravel 团队的精心打造。
image

这一节开始,我们来介绍它具体使用方法。


如何使用

安装

第一步、通过安装广播安装

方式一

在执行之前,需要把nodejs版本切换到22.0.0以上哦

php artisan install:broadcasting

执行后,提示:您想安装并构建广播所需的节点依赖关系吗?
image

方式二

composer require laravel/reverb

安装完成后,我们查看:config/broadcasting.php 文件:

<?php

return [

/*
|--------------------------------------------------------------------------
| 默认广播器
|---------------------------------------------------------------------------
|
| 此选项控制当需要广播事件时框架将使用的默认广播器。您可以将其设置为
| 下面“connections”数组中定义的任何连接。
|
| 支持:“reverb”、“pusher”、“ably”、“redis”、“log”、“null”
|
*/

'default' => env('BROADCAST_CONNECTION', 'null'),

/*
|---------------------------------------------------------------------------------------
| 广播连接
|---------------------------------------------------------------------------------------
|
| 您可以在此处定义将用于
| 将事件广播到其他系统或通过 WebSocket 广播的所有广播连接。此数组中提供了
| 每种可用连接类型的示例。
| */

'connections' => [

'reverb' => [
'driver' => 'reverb',
'key' => env('REVERB_APP_KEY'),
'secret' => env('REVERB_APP_SECRET'),
'app_id' => env('REVERB_APP_ID'),
'options' => [
'host' => env('REVERB_HOST'),
'port' => env('REVERB_PORT', 443),
'scheme' => env('REVERB_SCHEME', 'https'),
'useTLS' => env('REVERB_SCHEME', 'https') === 'https',
],
'client_options' => [
// Guzzle 客户端选项: https://docs.guzzlephp.org/en/stable/request-options.html
],
],

'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY'),
'secret' => env('PUSHER_APP_SECRET'),
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'host' => env('PUSHER_HOST') ?: 'api-'.env('PUSHER_APP_CLUSTER', 'mt1').'.pusher.com',
'port' => env('PUSHER_PORT', 443),
'scheme' => env('PUSHER_SCHEME', 'https'),
'encrypted' => true,
'useTLS' => env('PUSHER_SCHEME', 'https') === 'https',
],
'client_options' => [
// Guzzle 客户端选项:https://docs.guzzlephp.org/en/stable/request-options.html
],
],

'ably' => [
'driver' => 'ably',
'key' => env('ABLY_KEY'),
],

'log' => [
'driver' => 'log',
],

'null' => [
'driver' => 'null',
],

],

];

接着我们修改.env文件中:

BROADCAST_CONNECTION=reverb

配置

在后台,install:broadcasting Artisan 命令将运行 reverb:install 命令,该命令将使用一组合理的默认配置选项安装 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

允许的来源

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

'apps' => [
    [
        'app_id' => 'my-app-id',
        'allowed_origins' => ['laravel.com'],
        // ...
    ]
]

其他应用程序

通常,Reverb 会为安装该应用程序的应用程序提供 WebSocket 服务器。但是,可以使用单个 Reverb 安装为多个应用程序提供服务。

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

'apps' => [
    [
        'app_id' => 'my-app-one',
        // ...
    ],
    [
        'app_id' => 'my-app-two',
        // ...
    ],
],

SSL

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

但是,有时,例如在本地开发期间,让 Reverb 服务器直接处理安全连接会很有用。如果您正在使用 Laravel Herd 的安全站点功能,或者您正在使用 Laravel Valet 并已针对您的应用程序运行安全命令,则可以使用为您的站点生成的 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 访问。

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

'options' => [
    'tls' => [
        'local_cert' => '/path/to/cert.pem'
    ],
],

Herd (Laravel开发 完善 一键式 PHP 开发环境。)

image

heard是laravel全新的一键式 PHP 开发环境。 零依赖。零烦恼。我在b站上也看到一些up主在使用了。这个工具支持mac 和windows,大家也可以尝试下:官网

命令行

reverb
  reverb:install            Install the Reverb dependencies
  reverb:restart            Restart the Reverb server
  reverb:start              Start the Reverb server

相关命令

# 运行
php artisan reverb:start
php artisan reverb:start --host=127.0.0.1 --port=9000
php artisan reverb:start --debug
php artisan reverb:restart
# 

对于host port 等配置,也可以通过在应用程序的 .env 配置文件中定义 REVERB_SERVER_HOST 和 REVERB_SERVER_PORT 环境变量。

REVERB_SERVER_HOST 和 REVERB_SERVER_PORT 环境变量不应与 REVERB_HOST 和 REVERB_PORT 混淆。前者指定运行 Reverb 服务器本身的主机和端口,而后者指示 Laravel 将广播消息发送到何处。例如,在生产环境中,您可以将来自端口 443 上的公共 Reverb 主机名的请求路由到在 0.0.0.0:8080 上运行的 Reverb 服务器。在这种情况下,您的环境变量将定义如下:

REVERB_SERVER_HOST=0.0.0.0
REVERB_SERVER_PORT=8080

REVERB_HOST=ws.laravel.com
REVERB_PORT=443

生产环境使用

通过nginx反向代理

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;
    }

    ...
}

优化

文件描述符

image

event loop

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

Reverb 将在可用时自动切换到 ext-uv 支持的循环。此 PHP 扩展可通过 PECL 安装:

pecl install uv

image

Supervisor 守护进程管理

使用宝塔的可以图形化操作,命令行就自行AI,关注一个优化参数:

[supervisord]
...
minfds=10000

参考文献

posted @ 2025-03-12 13:58  wanzij  阅读(111)  评论(0)    收藏  举报
TOP