lanks / laravel-echo-server-php
基于 Sockeio PHP(React PHP 服务器)的 Laravel Echo 服务器实现。
Requires
- illuminate/support: ^5.8@dev
- lanks/socket.io-php: dev-master
- react/event-loop: ^1.0.0
- react/http: dev-master
- react/http-client: dev-master
- react/promise: v2.7.1
This package is auto-updated.
Last update: 2024-09-25 06:29:53 UTC
README
PHP 的 Laravel Echo 的 Socket.io 服务器
Laravel Echo 服务器
用于 Laravel Echo 广播的 NodeJs 服务器。
系统要求
以下要求是正常工作的。
- Laravel 5.3
- Node 6.0+
- Redis 3+
有关 Laravel 广播的更多信息,请参阅官方文档:[https://laravel.net.cn/docs/master/broadcasting](https://laravel.net.cn/docs/master/broadcasting)
入门指南
使用以下命令全局安装 npm 包
$ npm install -g laravel-echo-server
使用 CLI 工具初始化
在您的项目目录中运行 init 命令
$ laravel-echo-server init
该 CLI 工具将帮助您在项目的根目录中设置一个 laravel-echo-server.json 文件。该文件将在服务器启动时被加载。您可以在以后编辑此文件以管理服务器的配置。
API 客户端
Laravel Echo 服务器暴露了一个轻量级 HTTP API 以执行广播功能。出于安全考虑,必须使用 API id 和密钥对来自 http 引用者的端点进行认证。这可以通过 CLI 命令生成。
$ laravel-echo-server client:add APP_ID
如果您在运行 client:add
时没有提供 app id 参数,则会为您生成一个。运行此命令后,客户端 id 和密钥将显示并存储在 laravel-echo-server.json 文件中。
在此示例中,只要在 http 请求中同时提供了 app id 和密钥,就会允许请求。
Request Headers Authorization: Bearer skti68i... or http://app.dev:6001/apps/APP_ID/channels?auth_key=skti68i...
您可以使用 laravel-echo-server client:remove APP_ID
移除客户端
运行服务器
在您的项目根目录中,运行
$ laravel-echo-server start
停止服务器
在您的项目根目录中,运行
$ laravel-echo-server stop
可配置选项
通过向您的 laravel-echo-server.json 文件添加选项来编辑服务器的默认配置。
DotEnv
如果在与 laravel-echo-server.json 文件相同的目录中找到了 .env 文件,则可以覆盖以下选项
authHost
:LARAVEL_ECHO_SERVER_AUTH_HOST
注意:如果 .env 文件中设置了LARAVEL_ECHO_SERVER_HOST
选项,则此选项将回退到该选项作为默认值。host
:LARAVEL_ECHO_SERVER_HOST
port
:LARAVEL_ECHO_SERVER_PORT
devMode
:LARAVEL_ECHO_SERVER_DEBUG
使用 SSL 运行
- 您的客户端实现必须从 https 访问 socket.io 客户端。
- 服务器配置必须将服务器主机设置为使用 https。
- 服务器配置应包含位于您的服务器上的 SSL 证书和密钥的路径。
注意:此库当前仅支持从 http 或 https 中之一提供服务,不支持两者。
替代 SSL 实现
如果您在使用此软件包时难以实现SSL,可以考虑使用Apache或NginX中的代理模块。本质上,您可以将WebSocket流量连接到https://yourserver.dev:6001/socket.io……并尝试对其进行安全化,而不是将其连接到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";
}
设置工作目录
laravel-echo-server
将在其中查找配置文件laravel-echo-server.json
的工作目录可以通过start
命令通过--dir
参数传递,如下所示:laravel-echo-server start --dir=/var/www/html/example.com/configuration
订阅者
Laravel Echo Server通过两种方法订阅传入的事件:Redis和Http。
Redis
您的核心应用程序可以使用Redis将事件发布到频道。Laravel Echo Server将订阅这些频道,并通过socket.io广播这些消息。
Http
使用Http,您也可以以与Redis相同的方式将事件发布到Laravel Echo Server,只需向广播端点提交一个channel
和message
即可。您需要生成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" }
channel - 要广播事件的频道名称。对于私有或存在频道,请将private-
或presence-
添加到前面。 channels - 您可以使用单个请求广播到一组频道。 name - 代表您应用程序中事件键的字符串。 data - 您希望广播到频道的数据。 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
来指定跨域访问。然后,您可以设置API可以接收的CORS Access-Control-Allow-Origin、Access-Control-Allow-Methods(默认启用GET和POST)和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" } } }
注意:主机地址不应该使用方案(http/https等)
Redis选项的完整列表可以在这里找到。
SQLite
使用SQLite时,您可能想要更改数据库存储的路径
{ "databaseConfig" : { "sqlite" : { "databasePath": "/path/to/laravel-echo-server.sqlite" } } }
注意:此数据库需要node-sqlite3。请在使用前安装。
npm install sqlite3 -g
存在通道
当用户加入存在通道时,他们的存在通道身份验证数据会使用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
,您应该能够像这样向您的html添加一个script标签
<script src="//app.dev:6001/socket.io/socket.io.js"></script>
注意:当从您的运行服务器使用socket.io客户端库时,请记住在使用事件订阅之前检查io
全局变量是否已定义。
使用<µWebSockets获得更好的性能
为了获得额外的性能,您可以使用更快的uws
引擎而不是ws
,通过在laravel-echo-server.json
中设置Socket.IO的wsEngine
选项
"socketio": { "wsEngine": "uws" }