搭建基于 Soketi 的 WebSockets 高性能服务(Laravel 广播组件零侵入免费使用)
因项目需求核心功能对 WebSocket 高度依赖,所以调研了Larave支持比较好的驱动,Laravel 官方推荐了 Pusher、Ably 以及开源的 laravel-websockets 和 Soketi,前2个集成起来非常简单,但是考虑网络延迟的原因放弃了。
最终选择了 Soketi 提供 WebSocket 服务,主要原因还是考虑到性能(还没有做压力测试),而且还完全兼容 Pusher v7 协议,官网介绍:
Soketi is your simple, fast, and resilient open-source WebSockets server
在阿里云上配置了一个对外的服务,在开发过程中如果想做测试可以直接使用,我之前都是用 Pusher 做的测试,有时候网络延时的确很高,一点不稳定。
首先就是要安装 composer require pusher/pusher-php-server
来支持推送。
具体的配置信息和 pusher 稍有不同,主要就是自定义了 host 和 port 到自定义的服务器,其他都是一样的。
env 文件
BROADCAST_DRIVER=pusher
PUSHER_APP_ID=532232132
PUSHER_APP_KEY=DZIqMLJdGi633kB3BYHN
PUSHER_APP_SECRET=pelvQlQFJecoYWvVUbF8
PUSHER_APP_CLUSTER=ap3
PUSHER_HOST=pusher.qiyuankeji.cn
PUSHER_PORT=6002
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
MIX_PUSHER_HOST="${PUSHER_HOST}"
MIX_PUSHER_PORT="${PUSHER_PORT}"
config/broadcasting.php
'pusher' => [
'driver' => 'pusher',
'key' => env('PUSHER_APP_KEY', 'app-key'),
'secret' => env('PUSHER_APP_SECRET', 'app-secret'),
'app_id' => env('PUSHER_APP_ID', 'app-id'),
'options' => [
'host' => env('PUSHER_HOST', '127.0.0.1'),
'port' => env('PUSHER_PORT', 6001),
'scheme' => env('PUSHER_SCHEME', 'https'),
'encrypted' => true,
'useTLS' => env('PUSHER_SCHEME') === 'https',
],
],
resources/js/bootstrap.js
import Echo from 'laravel-echo';
window.Pusher = require('pusher-js');
window.Echo = new Echo({
broadcaster: 'pusher',
key: process.env.MIX_PUSHER_APP_KEY,
wsHost: process.env.MIX_PUSHER_HOST,
wsPort: process.env.MIX_PUSHER_PORT,
wssPort: process.env.MIX_PUSHER_PORT,
forceTLS: false,
encrypted: true,
disableStats: true,
enabledTransports: ['ws', 'wss'],
});
配置好这些就可以直接使用 Echo 来监听广播了,争取一直稳定的运行下去,后续做个免费申请独立秘钥的接口,就可以玩起来了。
PUSHER_APP_ID=532232132
PUSHER_APP_KEY=DZIqMLJdGi633kB3BYHN
PUSHER_APP_SECRET=pelvQlQFJecoYWvVUbF8
PUSHER_HOST=pusher.qiyuankeji.cn
PUSHER_PORT=6002
ps: 如果使用授权频道,记得在 app.php 中将 BroadcastServiceProvider 前的注释取消掉。
本作品采用《CC 协议》,转载必须注明作者和本文链接
这么说,可以放弃laravel-websockets了?
laravel-websockets 不推荐,对Laravel侵入太强了。
mark
我以为是Soketi使用教程,结果……
WebSocket 高度依赖的项目,为何不直接选择workerman呢
楼主你确定你安装的是
Soketi
吗?