artisansdk/server

一个基于服务的、Laravel PHP 实现的异步、实时 WebSocket 服务器。

1.0.4 2017-04-20 17:39 UTC

This package is auto-updated.

Last update: 2024-09-10 21:09:03 UTC


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 地址
  • UpgradeConnection 标头指示浏览器升级到 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.managerApp\Manager::class,以便服务器知道使用哪个管理器。

<?php

return [
    'manager' => App\Manager::class,
];

将消息推送到实时队列

默认情况下,ArtisanSDK\Server\Manager@boot()方法会将队列工作器添加到异步事件循环中,以便可以将“离线”消息发送到“实时”连接的WebSocket客户端。您可以使用任何异步驱动程序(基本上不要使用sync作为队列驱动程序),但如果您使用Laravel Forge,使用beanstalkd驱动程序比较容易。在您的.env中设置SERVER_QUEUE_DRIVERSERVER_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文件。