最近因為平臺需要做即使聊天,因此嘗試自己架 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
簡永哲 Leo Chien
IT Manager | 大師鏈 MasterChain
E: leo@masterchain.media