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