artisansdk / server
一个基于服务的、Laravel PHP 实现的异步、实时 WebSocket 服务器。
Requires
- php: >=5.6.4
- cboden/ratchet: ~0.3.6
- illuminate/bus: ~5.4
- illuminate/contracts: ~5.4
- illuminate/support: ~5.4
- ramsey/uuid: ~3.5
- react/child-process: ~0.4.3
- wyrihaximus/react-guzzle-psr7: ~2.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ~2.2
- fzaninotto/faker: ~1.4
- mockery/mockery: 0.9.*
- phpunit/phpunit: ~5.7
README
一个基于服务的、Laravel PHP 实现的异步、实时 WebSocket 服务器。
目录
安装
该软件包像任何其他 Laravel 软件包一样安装到 Laravel 应用程序中。
composer require artisansdk/server ~1.0
然后在您的 Laravel 应用程序的 config/app.php
中,将 ArtisanSDK\Server\Provider::class
添加到 providers
键。这将注册由软件包提供的配置和 Artisan 命令。您可以通过运行以下命令将这些配置发布到 config/server.php
:
php artisan vendor:publish --provider="ArtisanSDK\\Server\\Provider" --tag=config
展示给我:您可以通过浏览
larandomizer/app
的源代码来了解如何集成此软件包,它是一个用于会议和会议的完整功能的奖品抽奖应用程序。
配置环境
您仍然需要编辑 .env
文件以自定义环境设置。请注意,由于所有数据都存储在服务器上的内存中,因此不使用数据库。重新启动服务器将导致所有数据丢失。以下是可以用于服务器自定义的选项:
SERVER_ADDRESS
(127.0.0.1
):设置服务器应绑定的地址(0.0.0.0
将允许所有外部连接)SERVER_PORT
(8080
):设置服务器将监听用于 WebSocket 连接的端口号SERVER_MAX_CONNECTIONS
(100
):在达到此限制后,服务器拒绝新的连接(设置为0
以允许无限连接)SERVER_QUEUE
(default
):实时消息将被发送到的队列名称SERVER_QUEUE_DRIVER
(beanstalkd
):用于实时消息队列的驱动程序SERVER_KEY
(password
):用于认证针对受保护连接的连接的管理员密码
Nginx WebSocket 代理配置
Nginx 是 Laravel 后端应用程序的完美轻量级前端服务器。此外,它可以用于将端口 80
上的 WebSocket 连接代理到默认的 8080
服务器套接字。这样做可以帮助绕过一些防火墙设置。以下内容应放置在您的 Laravel 应用程序本身的默认 location
指令之前(例如:Forge 的默认设置)。使用这些设置,您可以使用 wss://
协议安全地托管 WebSocket,允许 Nginx 处理 SSL 连接,而您的 WebSocket 服务器处理基本 HTTP。
location /server/ {
proxy_pass http://127.0.0.1:8080;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 5m;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
关于设置的简要说明
location /server/
将所有前往/server/
的流量定向到代理proxy_pass
将流量传递到本地的端口8080
上的 localhost 服务器proxy_read_timeout
自定义连接挂起以断开空闲连接proxy_http_version
是 HTTP 中 WebSocket 协议的版本X-Real-IP
标头提供了客户端连接的真实 IP 地址Upgrade
和Connection
标头指示浏览器升级到 WebSocket 连接
运行服务器
WebSocket 服务器可以作为控制台命令使用 php artisan server:start
运行,如果您向命令传递 --help
,则可以查看更多选项。您可以通过使用 CMD + C
(或 CTRL + C
)终止正在运行的服务器。
在生产环境中,您可能希望Supervisor监视服务器并在它崩溃时重新启动它。演示应用程序有一个“重新启动服务器”命令,实际上只是停止服务器并期望Supervisor自动重新启动它。如果您使用Laravel Forge,通过在服务器上添加一个新的守护进程并配置如下即可轻松实现:
- 命令:
/usr/bin/php /home/forge/default/artisan server:start
- 用户:
forge
生成的Supervisor配置可能如下:
[program:server]
command=/usr/bin/php /home/forge/default/artisan server:start
autostart=true
autorestart=true
user=forge
redirect_stderr=true
startsecs=1
stdout_logfile=/home/forge/.forge/server.log
Forge默认不添加startsecs
,但在实践中这可能是必需的,以便给服务器足够的时间启动而不会硬退出,并迫使Supervisor放弃启动进程。
使用说明
扩展服务器管理器
WebSocket服务器是一个单例实例,它通过Broker
包装所有连接客户端和服务器之间的连接和消息。虽然这个类很少需要修改,但代理与Manager
类协作。您可以将其视为应用程序的核心,因为它在整个服务器运行期间维护初始启动状态和事件循环。它有合理的默认设置,但可能需要扩展以处理特定领域。
简单地在您的本地命名空间中创建一个新的管理器类,并包含一个boot()
方法,它将被调用来初始化应用程序的定制监听器。
<?php namespace App; use ArtisanSDK\Server\Manager as BaseManager; class Manager extends BaseManager { public function boot() { parent::boot(); $this->listener(...); } }
如您在示例中所见,如果您想保持现有行为并简单地添加新行为,那么调用父类的boot()
方法是个好主意。类扩展后,现在只需更新位于app/server.php
下的配置设置server.manager
为App\Manager::class
,以便服务器知道使用哪个管理器。
<?php return [ 'manager' => App\Manager::class, ];
将消息推送到实时队列
默认情况下,ArtisanSDK\Server\Manager@boot()
方法会将队列工作器添加到异步事件循环中,以便可以将“离线”消息发送到“实时”连接的WebSocket客户端。您可以使用任何异步驱动程序(基本上不要使用sync
作为队列驱动程序),但如果您使用Laravel Forge,使用beanstalkd
驱动程序比较容易。在您的.env
中设置SERVER_QUEUE_DRIVER
和SERVER_QUEUE
以配置实时消息的驱动程序和队列名称。
要从您的“离线”代码(例如:控制器、存储库等)将消息发送到您的“实时”代码,您可以在调用类中使用use ArtisanSDK\Server\Traits\WebsocketQueue
特性,然后调用$this->queue(new Command)
将服务器命令推送到WebSocket服务器的事件循环。命令将几乎立即运行,尽管可能存在一些延迟,这取决于事件循环中剩余的命令。您可以在ArtisanSDK\Server\Manager@boot()
方法的工人配置中调整工人的时间。
认证客户端消息
已设置基本认证方案,允许服务器对连接进行PromptForAuthentication
,并记住该连接已认证。这简化了进一步的消息处理,并依赖于任何必须经过认证的ClientMessage
实现authorize()
方法。有三个基本特性可以在任何消息上使用,以实现几种常见策略。
ArtisanSDK\Server\Traits\NoProtection
:总是返回true,允许任何客户端发送消息ArtisanSDK\Server\Traits\ClientProtection
:允许管理员或特定的连接进行授权ArtisanSDK\Server\Traits\AdminProtection
:允许只有管理员可以授权发送消息
许可
版权所有 (c) 2023 Artisan Made
本软件包采用MIT许可发布。有关商业许可条款,请参阅随代码副本一起分发的LICENSE文件。