Laravel 如何使用 Docker 快速架起 Echo Server(上)
最近因為平台需要做即时聊天,因此嘗試自己架 Echo Server。其實我們之前已經有用 Pusher 來做一些需要 Socket 的功能,但若要做即時聊天需考量成本,因此這次決定自己架 Echo Server 來節省費用。
本篇將示範如何使用 Laradock 快速架好 Echo Server,並發送即時訊息,在開始前,請先對 Docker 及 WebSocket 有基礎的認識,及了解如何使用 Redis 作為 Laravel 的 Queue Driver。
系統需求:
- Docker
- Docker Compose
- Laravel 5.6
首先建出一個空的 Laravel 專案,詳細方法請參考 官方文件
$ laravel new echo
$ cd echo
這次我們使用 Laradock 來快速建立專案,但本篇不會太深入講解 Laradock 使用方法,有興趣的同學請看官網示範
$ git clone https://github.com/Laradock/laradock.git
$ cd laradock
$ cp env-example .env
啟動 Laradock,並進入 container 內安裝 Laravel 必要環境
$ docker-compose up -d php-worker laravel-echo-server nginx redis
$ docker-compose exec --user=laradock workspace bash
$ composer install && npm install
接著,我們打開瀏覽器,並訪問 http://localhost 就可以看到 Laravel 已經成功啟動
到這邊為止,我們已經做完基本的環境配置
接著我們要針對 Laravel 的廣播系統進行配置,首先修改專案根目錄下的 .env
,將 queue 及 broadcast driver 改為 Redis,並修改 REDIS_HOST
BROADCAST_DRIVER=redis
CACHE_DRIVER=file
SESSION_DRIVER=file
SESSION_LIFETIME=120
QUEUE_DRIVER=sync
REDIS_HOST=redis
參考 官方文件,我們還需安裝 predis
套件
$ composer require predis/predis
試著建立一個 Event 以測試廣播能否正常執行
$ php artisan make:event BroadcastEvent
打開 app/Events/BroadcastEvent.php
,我們將 BroadcastEvent
Class 繼承 ShouldBroadcast
類,Laravel 將會自動為我們廣播本事件
...
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class BroadcastEvent implements ShouldBroadcast
{
...
打開 routes/web.php ,在訪問 / 時觸發此事件
Route::get('/', function () {
// 加入以下程式碼來觸發 Event
event(new \App\Events\BroadcastEvent());
return view('welcome');
});
這時開啟瀏覽器,訪問 http://localhost/ 就可以向 Redis 註冊此事件,這裡我使用 Medis 連結 redis,查看事件註冊結果
在這個步驟若沒看到東西是正常的,因為這個事件註冊後很快就會被 Laravel Queue 執行並刪除,因此會看到事件很快出現又很快消失,想看到事件被註冊的過程手速要快。
上篇就到這邊,總結一下我們學到的:
- 使用 Laradock 作為 Laravel 開發環境
- 建立並觸發 Laravel Broadcast Event
- 使用 Medis 圖形化介面管理 Redis
下篇 會用 Vue.js 作為前端框架,從前端發送訊息及接收廣播。
部落格文章: https://bit.ly/2HcQTXZ
本作品采用《CC 协议》,转载必须注明作者和本文链接
想看到事件被註冊的過程手速要快。
,哈哈你启动了websocket服务器吗?
@xuanjiang1985 對,Laravel 官方驅動有使用 Pusher 服務及自架 WebSocket 服務器,我用的是 Laravel 社群維護的 Laravel Echo Server 來架
@leochien 我用go启动websocket, redis 做订阅发布。laravel echo 不知道怎么用,看文档也有点模糊。
@xuanjiang1985 文檔對 Echo Server 真的寫的滿模糊,我摸了好久才弄起來,而且碰到另一個問題,讓我又發了一篇解決過程XD
所以你們是用 Go 來替代,並已經使用在 production 環境了嗎
请教下楼主 这个docker 能解决 并发与负载的问题嘛,能承受10W人在线的广播么?
@diobrando 我們的用戶數沒那麼大,沒辦法回答你這個問題,不好意思 😅
那启动 laravel-echo-server start 服务的时候有什么优化么
还有有没有一种方法可以吧所有命令 自动执行 不用进入命令行 自己敲了的那种
laravel-echo-server 相關的優化可以到 Dockerfile 裡面設定
所有命令自動執行是指哪些