porygon/laravel-echo-server

laravel-echo-server var.workerman

dev-main 2023-09-18 06:00 UTC

This package is auto-updated.

Last update: 2024-09-18 07:56:19 UTC


README

基于 Workerman 的 Laravel Echo 广播服务器的 PHP 服务器。

系统要求

以下内容是正常工作的必要条件。

  • Laravel 5.3
  • Redis 3+

有关 Laravel 广播的更多信息,请参阅官方文档: Laravel-broadcasting

入门指南

使用以下命令安装软件包

$   composer require porygon/laravel-echo-server

发布服务提供者

在您的项目目录中运行命令

$   php artisan vendor:publish --provider=Porygon\\LaravelEchoServer\\EchoServerServiceProvider

此命令将发布一个配置文件和一个 http-subscriber 路由文件。

运行服务器

在项目根目录下运行

$ php artisan laravel-echo-server start

停止服务器

在项目根目录下运行

$ laravel-echo-server stop

可配置选项

通过向您的 echo-server.php 文件中添加选项来编辑服务器的默认配置。

使用 SSL 运行

  • 您的客户端实现必须从 https 访问 socket.io 客户端。
  • 服务器配置必须将服务器主机设置为使用 https。
  • 服务器配置应包括您服务器上 ssl 证书和密钥的路径。

注意:此库目前仅支持从 http 或 https 中之一提供服务,不支持两者。

替代 SSL 实现

如果您在使用此软件包时遇到 SSL 实现问题,您可以考虑在 Apache 或 NginX 中使用代理模块。基本上,您不是将 WebSocket 流连接到 https://yourserver.dev:6001/socket.io?..... 并尝试对其进行加密,而是将 WebSocket 流连接到 https://yourserver.dev/socket.io。在幕后,Apache 或 NginX 的代理模块将被配置为拦截对 /socket.io 的请求,并将这些请求内部重定向到端口号为 6001 的非 SSL Echo 服务器。这将在浏览器和 web 服务器之间保持所有流加密,因为您的 web 服务器仍然会执行 SSL 加密/解密。唯一未加密的是您的 web 服务器和 Echo 服务器之间的流量,这在许多情况下可能是可以接受的。

示例 NginX 代理配置
#the following would go within the server{} block of your web server config
location /socket.io {
	    proxy_pass http://laravel-echo-server:6001; #could be localhost if Echo and NginX are on the same box
	    proxy_http_version 1.1;
	    proxy_set_header Upgrade $http_upgrade;
	    proxy_set_header Connection "Upgrade";
	}

示例 Apache 代理配置

RewriteCond %{REQUEST_URI}  ^/socket.io            [NC]
RewriteCond %{QUERY_STRING} transport=websocket    [NC]
RewriteRule /(.*)           ws://:6001/$1 [P,L]

ProxyPass        /socket.io https://:6001/socket.io
ProxyPassReverse /socket.io https://:6001/socket.io

订阅者

Laravel Echo 服务器通过两种方法订阅传入的事件:Redis 和 Http。

Redis

您的核心应用程序可以使用 Redis 向频道发布事件。Laravel Echo 服务器将订阅这些频道,并通过 socket.io 广播这些消息。

Http [即将推出]

使用 Http,您也可以通过向广播端点提交 channelmessage 的方式,以与 Redis 相同的方式将事件发布到 Laravel Echo 服务器。您需要在 API 客户端 部分中生成 API 密钥,并提供正确的 API 密钥。

请求端点

POST http://app.dev:6001/apps/your-app-id/events?auth_key=skti68i...

请求正文

{
  "channel": "channel-name",
  "name": "event-name",
  "data": {
    "key": "value"
  },
  "socket_id": "h3nAdb134tbvqwrg"
}

频道 - 向其广播事件的频道名称。对于私有或存在状态频道,请在前缀加上 private-presence-频道 - 不使用单个频道,您可以在一个请求中向频道数组广播。 名称 - 表示您应用程序中事件键的字符串。 数据 - 您希望向频道广播的数据。 socket_id (可选) - 触发事件的用户的 socket id。当存在时,服务器将只向“其他人”广播。

Pusher

HTTP 订阅者与 Laravel Pusher 订阅者兼容。只需配置 Socket.IO 服务器的主机和端口,并在 config/broadcasting.php 中设置应用 id 和密钥。密钥不是必需的。

 'pusher' => [
    'driver' => 'pusher',
    'key' => env('PUSHER_KEY'),
    'secret' => null,
    'app_id' => env('PUSHER_APP_ID'),
    'options' => [
        'host' => 'localhost',
        'port' => 6001,
        'scheme' => 'http'
    ],
],

现在您可以使用 HTTP 发送事件,而无需使用 Redis。这也允许您使用 Pusher API 来列出频道/用户,如 Pusher PHP 库 中所述。

HTTP API [即将推出]

HTTP API 提供了端点,允许您收集有关正在运行的服务器和频道的信息。

状态 获取客户端总数、服务器运行时间和内存使用情况。

GET /apps/:APP_ID/status

频道 所有频道列表。

GET /apps/:APP_ID/channels

频道 获取特定频道的信息。

GET /apps/:APP_ID/channels/:CHANNEL_NAME

频道用户 频道上的用户列表。

GET /apps/:APP_ID/channels/:CHANNEL_NAME/users

API 的跨域访问

在 laravel-echo-server.json 文件中,通过将 apiOriginAllow 中的 allowCors 改为 true 来指定跨域访问。然后,您可以将 CORS Access-Control-Allow-Origin、Access-Control-Allow-Methods 设置为逗号分隔的字符串(默认启用 GET 和 POST)以及 API 可以接收的 Access-Control-Allow-Headers。

以下示例

{
  "apiOriginAllow": {
    "allowCors": true,
    "allowOrigin": "http://127.0.0.1",
    "allowMethods": "GET, POST",
    "allowHeaders": "Origin, Content-Type, X-Auth-Token, X-Requested-With, Accept, Authorization, X-CSRF-TOKEN, X-Socket-Id"
  }
}

这允许您从可能运行在同一域名但不同端口或完全不同域的应用程序中通过 AJAX 向 API 发送请求。

数据库

为了持久化存在状态频道数据,支持使用 Redis 或 SQLite 作为键/值存储。键是频道名称,值是存在状态频道成员的列表。

每个数据库驱动可以在 laravel-echo-server.json 文件中的 databaseConfig 属性下进行配置。选项会传递到数据库提供者,因此开发人员可以随意设置。

Redis

例如,如果您想向 Redis 传递自定义配置

{
  "databaseConfig": {
    "redis": {
      "port": "3001",
      "host": "redis.app.dev",
      "keyPrefix": "my-redis-prefix"
    }
  }
}

注意:主机地址不应使用方案(http/https 等)

Redis 选项的完整列表可以在 此处 找到。

存在频道

当用户加入存在频道时,他们的存在频道身份验证数据会使用 Redis 存储。

虽然存在频道包含用户列表,但在某些情况下,用户会多次加入存在频道。例如,当打开多个浏览器标签时,这种情况会发生。在这种情况下,“加入”和“离开”事件只会发送到用户的第一个和最后一个实例。

可选地,您可以通过将 databaseConfig.publishPresence 设置为 true 来配置 laravel-echo-server 在更新存在频道时发布事件。

{
  "database": "redis",
  "databaseConfig": {
    "redis": {
      "port": "6379",
      "host": "localhost"
    },
    "publishPresence": true
  }
}

您可以使用 Laravel 的 Redis 集成来从那里触发应用程序代码。

Redis::subscribe(['PresenceChannelUpdated'], function ($message) {
    var_dump($message);
});

客户端配置

有关更多信息,请参阅官方 Laravel 文档。 https://laravel.net.cn/docs/master/broadcasting#introduction

技巧

Socket.io 客户端库

您可以从运行中的服务器包含 socket.io 客户端库。例如,如果您的服务器在 app.dev:6001 上运行,您应该能够将一个 script 标签添加到您的 html 中,如下所示

<script src="//app.dev:6001/socket.io/socket.io.js"></script>

注意:当使用运行中的服务器中的 socket.io 客户端库时,请记住在订阅事件之前检查 io 全局变量是否已定义。

µWebSockets 弃用

µWebSockets 已正式弃用。目前 Socket.IO 不再支持 µWebSockets,但可能即将引入对新的 ClusterWS 的支持。同时,Laravel Echo Server 将默认使用 ws 引擎,直到有其他选项为止。