laravel websocket服務 echo-server搭建(redis驅動)

ptzhu發表於2021-06-11

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 協議》,轉載必須註明作者和本文連結

相關文章