基於 Redis驅動的 Laravel 事件廣播

早起寫程式碼發表於2018-03-20

一、前言

之前在專案中需要使用laravel的事件廣播,而且專案打算使用redis作為驅動,但發現網上的資料大部分都是Pusher驅動的,只能自己摸索著搭建了一下服務。現在將這個過程記錄一下,希望能幫到其他人。

二、專案的環境

事件廣播需要用到redis,nodejs,不同的版本在安裝過程中會遇到一些問題,大家有興趣可以看看我之前提過的一個問題:npm install 報錯,下面是我開發時的環境:

  • laravel 5.3
  • node v6.11.4
  • redis 3.0.500

三、具體的搭建流程

其實大概的步驟在官方文件上已經給出來了,laravel5.3 官方文件 廣播系統,這裡我就不講了,只把整體的流程寫下來~

3.1 在config/app.config中取消AppProvidersBroadcastServiceProvider::class的註釋

3.2 安裝Predis擴充套件

composer require predis/predis;

3.3 安裝laravel-echo-server

npm install -g laravel-echo-server
然後需要將此服務初始化,
laravel-echo-server init

然後按照指引一步一步初始化就好

3.4 將laravel-echo-server 服務加入到resource/asset/app.js



import Echo from "laravel-echo"
window.Echo = new Echo({
    broadcaster: 'socket.io',
    host: window.location.hostname + ':6001' //一定不能用127.0.0.1(因為這個地方用127.0.0.1的時候,其他人訪問的時候會找自己的主機,而不是伺服器的主機)
});
//這裡放要監控的頻道名,以及要進行的操作
window.Echo.channel('user1').listen('EventChanged', (e) => {
    console.log(e.name);//比如我要輸出傳過來的人名
 });

3.5 編譯app.js檔案

由於app.js此時尚未進行編譯,所以需要編譯。編譯需要用到gulp,所以先安裝node的包

- npm install (會在根目錄下產生node_modules資料夾)
- npm install安裝過程中可能會遇到問題:
      安裝過程中如果遇到 deprecate gulp@3.9.1 › vinyl-fs@0.3.14 › glob-stream@3.1.18 › minimatch@^2.0.1
      執行 npm update -g minimatch@3.0.2npm update -g minimatch@3.0.2就可以
- 執行命令:gulp -watch或者npm run dev 將此js編譯,此時會報錯,can't resolve laravel-echo,解決方法:npm install laravel-echo

到此為止,基本上laravel-echo-server 的服務基本上已經搭好了,現在進行其他工作

3.6 建立要推送的事件,舉例TestEvent

3.6.1 生成事件
  php artisan make:event EventChanged    
3.6.2 廣播事件需要實現ShouldBrodcast介面
class EventChanged implements ShouldBroadcast
  • 在broadcaston中定義要廣播到哪個頻道

       public function broadcastOn()
     {
       return new Channel('user1');//比如廣播到user1
     }
  • 當一個事件被定義後,其所有public屬性都將被序列化,作為廣播的資訊傳送到指定頻道。
    //在broadcastWith中自定義要將哪些資訊廣播出去

     public function broadcastWith()
     {
       return ['name' => 'jack'];
     }
    
  • 在app/provider/BrodcastServiceProvider 的boot中設定廣播的頻道授權(return 為ture代表授權通過)

    Broadcast::channel('user1', function () {
      return true; //這個裡面可以寫授權的邏輯判斷,我這裡直接返回true了,不做驗證
    });

3.7 前端頁面js的引入

在你的前端頁面中引入編譯好的js檔案,以及socket.io檔案

//注意這兩個檔案的引入順序
<script src="http://{{Request::getHost()}}:6001/socket.io/socket.io.js"></script>
<script src="js/app.js"></script>

3.8 一些需要配置的配置項

3.8.1 整個環境還需要注意的一些配置項:
  • .env檔案中的 broadcastdriver = redis // 因為使用redis驅動,所以要設定好
  • appconfigbroadcasting.php 中'default' => env('BROADCAST_DRIVER', 'redis')
  • .env檔案中的 QUEUE_DRIVER,這個代表了佇列的驅動方式,因為事件廣播將事件扔到預設佇列進行推送,所以這個地方有兩種設定方式(詳情參照laravel佇列的相關文件):
    1.QUEUE_DRIVER = sync //這個代表本地驅動,如果採用這個設定的話沒什麼其他要操作的
    2.QUEUE_DRIVER = database //這個代表採用資料庫驅動
3.8.2 如果採用database驅動佇列的話首先要執行
  • php artisan queue:table生成jobs表遷移
  • php artisan migrate 執行遷移
  • 執行佇列 php artisan queue:work
3.8.3 需要手動開啟的服務(均在專案的根目錄下執行)
  • redis-server.exe (開啟redis服務,一定要啟動)
  • laravel-echo-server start (開啟socket服務)

四、總結

差不多上面就是所有的過程和步驟了,不知道有沒有很清楚。如果有可以幫到大家的地方,那就達到我寫這篇文章的目的了。

相關文章