laravel websocket服务 echo-server搭建(redis驱动)
node.js版本推荐lts的,最新版使用好像有点问题
安装predis
composer require predis/predis
同时.env设置 BROADCAST_DRIVER=redis QUEUE_CONNECTION=redis
安装npm相关包
npm install --save socket.io-client
npm install -g laravel-echo-server
实例化 Echo 时指定 socket.io 连接器和 host
在resource/js/bootstrap.js 引入
import Echo from "laravel-echo"
//window.io = require('socket.io-client'); 这个是有的会有问题引入不了,所以在对应的xxx.blade.php中单独引入js
window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001'
});
创建event
php artisan make:event TestEvent
默认在App\Events中生成
需要稍微修改一下代码 实现ShouldBroadcast
public function broadcastOn()
{
return new Channel('test-event');
}
public function broadcastWith()
{
return [
'time' => time(),
];
}
web.php中定义发送消息
Route::get('test-broadcast', function(){
broadcast(new \App\Events\TestEvent());
});
接收消息代码(在想要的xxx.blade.php中定义)
<script src="https://cdn.bootcdn.net/ajax/libs/socket.io/2.3.0/socket.io.js"></script> //对应上方的注释引入
<script src="{{ asset('js/app.js') }}" ></script>
<script>
window.Echo.channel('test-event')
.listen('TestEvent', (e) => {
console.log(e);
});
</script>
初始化laravle-echo-service 并启动
laravel-echo-server init (根目录生成laravle-echo-server.json文件配置)
laravel-echo-server start && php artisan queue:work(发布消息队列消费)
域名为ssl时需要注意的地方
配置ssl域名时,在laravel-echo-init需要选择https并指定证书位置,且nginx需要配置
location /socket.io {
proxy_pass http://laravel-echo-server:6001; #这里写http不要写https
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://localhost:6001/$1 [P,L]
ProxyPass /socket.io http://localhost:6001/socket.io
ProxyPassReverse /socket.io http://localhost:6001/socket.io
可能需要修改的地方
config/database.php中
'options' => [
'cluster' => env('REDIS_CLUSTER', 'redis'),
'prefix'=>'', //前缀设置为空,因为channel中会加上这个前缀,就对不上了
]
laracel-echo-server not found时可查看对应的node的bin目录下是否生成了laravel-echo-server执行文件,有可能是没生成软链接的原因,用ln -s创建软链接
最后先打开xxx.blade.php对应的页面,然后再打开/test-broadcast该路由对应页面,看消息是否推送到xxx.blade.php的控制台输出
参考自laravel8文档 和 laravel-echo-server
本作品采用《CC 协议》,转载必须注明作者和本文链接
不错,我也是用 redis
出个
vue
版本的