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 執行並刪除,因此會看到事件很快出現又很快消失,想看到事件被註冊的過程手速要快。


上篇就到這邊,總結一下我們學到的:

  1. 使用 Laradock 作為 Laravel 開發環境
  2. 建立並觸發 Laravel Broadcast Event
  3. 使用 Medis 圖形化介面管理 Redis

下篇 會用 Vue.js 作為前端框架,從前端發送訊息及接收廣播。

部落格文章: https://bit.ly/2HcQTXZ

本作品采用《CC 协议》,转载必须注明作者和本文链接
簡永哲 Leo Chien IT Director | 大師鏈 MasterChain E: s950329@hotmail.com
本帖由系统于 5年前 自动加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 9
庞浩然Paul

想看到事件被註冊的過程手速要快。 ,哈哈

6年前 评论

你启动了websocket服务器吗?

6年前 评论

@xuanjiang1985 對,Laravel 官方驅動有使用 Pusher 服務及自架 WebSocket 服務器,我用的是 Laravel 社群維護的 Laravel Echo Server 來架

6年前 评论

@leochien 我用go启动websocket, redis 做订阅发布。laravel echo 不知道怎么用,看文档也有点模糊。

6年前 评论

@xuanjiang1985 文檔對 Echo Server 真的寫的滿模糊,我摸了好久才弄起來,而且碰到另一個問題,讓我又發了一篇解決過程XD
所以你們是用 Go 來替代,並已經使用在 production 環境了嗎

6年前 评论

请教下楼主 这个docker 能解决 并发与负载的问题嘛,能承受10W人在线的广播么?

5年前 评论

@diobrando 我們的用戶數沒那麼大,沒辦法回答你這個問題,不好意思 😅

5年前 评论

那启动 laravel-echo-server start 服务的时候有什么优化么
还有有没有一种方法可以吧所有命令 自动执行 不用进入命令行 自己敲了的那种

5年前 评论

laravel-echo-server 相關的優化可以到 Dockerfile 裡面設定
所有命令自動執行是指哪些

5年前 评论

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