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 协议》,转载必须注明作者和本文链接
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 2

不错,我也是用 redis

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!