下面由laravel教程欄目給大家介紹一下使用 laravel-echo-server 構(gòu)建實時應(yīng)用的方法,希望對大家有所幫助!
在我看來,實時通信才是 APP 應(yīng)用的將來。 Socket ?服務(wù)通常不是那么容易實現(xiàn),但是 Laravel Echo 服務(wù)改變了這個情況。
在本文中,我將會簡要的介紹如何建立一個可以運行的 Socket 服務(wù)并且在這個服務(wù)上進行事件的廣播。(https://github.com/tlaverdure/laravel-echo-server, Laravel 的支持文檔: https://learnku.com/docs/laravel/5.6/broadcasting#driver-prerequisites)
它是完全免費的,你只要運行你自己的 Socket 服務(wù)。你也可以使用 Laravel 默認集成的 Pusher ,唯一的缺點是它是有限制的,如果超出限制則需要付費。我更喜歡自己來架構(gòu)這些東西。
要求:
- Laravel 框架 (本教程使用了 5.6 版本)
- Redis 服務(wù)
- 基本的 Laravel 知識
安裝 laravel-echo-server
首先我們需要全局安裝 laravel-echo-server ,你只需在終端輸入下面的命令。
$ npm install -g laravel-echo-server
安裝完成后,打開你的 Laravel 應(yīng)用,或者新啟一個測試項目:
$ composer create-project --prefer-dist laravel/laravel echo-test
接下來為我們的應(yīng)用安裝 Predis :
$ composer require predis/predis
安裝完成后,切換到項目根目錄下,初始化 Socket 服務(wù):
$ laravel-echo-server init
執(zhí)行這條命令后,會詢問你一些關(guān)于 Socket 服務(wù)的配置信息,你可以根據(jù)自己的情況填寫:
切記在生產(chǎn)環(huán)境中,無論你什么時候使用它,都應(yīng)該關(guān)掉你的開發(fā)者模式。
我們可以嘗試啟動服務(wù),看看它是否正常運行:
$ laravel-echo-server start
輸出結(jié)果看起來像這樣:
配置 Laravel 使 Laravel Echo?Server 正常工作
打開你的 ?config/app.php 文件并且取消 BroadcastServiceProvider 在這個 Providers 數(shù)組中的注釋:
AppProvidersBroadcastServiceProvider::class,
這個 Provider 將會啟動廣播路由(你或許已經(jīng)在 routes/channels.php 文件里面已經(jīng)看到了)
打開 .env? 文件,修改 ?BROADCAST_DRIVER 的值為你在 laravel-echo-server 初始化時定義的值(Redis 或者 Log)。在本教程中我們將使用 Redis 驅(qū)動程序。
同時修改 ?QUEUE_DRIVER 為你喜歡的任何隊列驅(qū)動程序,在這個示例中你可以輕松的將其更改為 Redis 驅(qū)動程序,因為你在前面已經(jīng)安裝并且在運行了。
接下來我們必須安裝 Socket.io 客戶端和 Laravel-Echo 包,你可以通過以下操作來安裝:
$ npm install --save socket.io-client $ npm install --save laravel-echo
(在運行這個之前你可能需要運行 ?npm install? 來安裝 Laravel 及相關(guān)依賴)
接下來打開 ?resources/assets/js/bootstrap.js? 文件, 或者你自己的 引入所有 JS 基礎(chǔ)代碼的 JS 文件。
現(xiàn)在我們要添加啟動 Echo 基礎(chǔ)服務(wù)的代碼:
import Echo from 'laravel-echo' window.io = require('socket.io-client'); window.Echo = new Echo({ broadcaster: 'socket.io', host: window.location.hostname + ':6001' });
現(xiàn)在我們準(zhǔn)備在頻道上監(jiān)聽消息了!我會在本教程中解釋怎么開放頻道,接下來開始收聽我們的第一個頻道:
window.Echo.channel('test-event') .listen('ExampleEvent', (e) => { console.log(e); });
我們通過 JS 代碼告訴程序我們訂閱了名為 ’test-event’ 的頻道, 并監(jiān)聽 ‘ExampleEvent’ 事件 (這是事件的類名,你也可以根據(jù)你的需要自定義)。
讓我們創(chuàng)建這個事件類:
$ php artisan make:event ExampleEvent
這將會在?App/Events 目錄下面創(chuàng)建一個叫做 ExampleEvent.php 的事件類
讓我們對這個事件類稍作調(diào)整使得它能夠在我們的 Socket 服務(wù) 中能夠正常運行,首先確保你的事件類繼承于 ShouldBroadcast 接口,就像下面這樣;
class ExampleEvent implements ShouldBroadcast
接下來向下滾動找到 ?broadcastOn? 函數(shù),修改它使得我們能夠在正確的頻道上進行廣播:
public function broadcastOn() { return new Channel('test-event'); }
讓我們在下面新建一個函數(shù),這樣我們才能有一些實例數(shù)據(jù):
public function broadcastWith() { return [ 'data' => 'key' ]; }
這個函數(shù)在事件被調(diào)用時調(diào)用,它將會把數(shù)據(jù)返回到你的 Socket 服務(wù)中。
現(xiàn)在讓我們開始嘗試它吧!打開你的 routes/web.php 文件并且新增一個測試路由:
Route::get('test-broadcast', function(){ broadcast(new AppEventsExampleEvent); });
(有很多種方式來廣播 ExampleEvent? 類 ,在這個示例中我使用 Laravel 提供的 broadcast() 助手,在我看來這是最簡潔的方式)
啟動隊列監(jiān)聽:
$ php artisan queue:listen --tries=1
瀏覽器打開一個包含 JS 文件的頁面(可以是 Laravel 默認的歡迎頁面),這是第一個頁面,請不要關(guān)閉次頁面,我們已經(jīng)在此頁面上訂閱了 Socket 服務(wù)。
接下來打開另一個頁面訪問 ?/test-broadcast ,這將會返回一個空白頁面,但是它將會通過你的 ExampleEvent? 類廣播到你的 Socket 服務(wù)上。返回到我們的第一個頁面,打開瀏覽器控制臺,應(yīng)該可以看到類似信息:
正如你所看到的,數(shù)據(jù)通過這種形式展示在我們的客戶端。你能輸入任意數(shù)據(jù)通過你的 ?ExampleEvent 類來廣播他們,這些數(shù)據(jù)可以是新聞更新,頁面更新,總瀏覽量或者更多。
因為我們有在 laravel-echo-server 配置中有設(shè)置開發(fā)者模式,所以你能看到 Socket 服務(wù)上的所有基本信息:
現(xiàn)在你已經(jīng)安裝并運行了一個基本的 Socket 服務(wù)!但這并不是全部,你可以根據(jù)這個來做更多的事情,比如為單個用戶提供認證的私有渠道。(當(dāng)您想廣播訂單更新或私人消息時)
要做到這一點,我建議你去查看 Laravel 文檔了解更多相關(guān)的內(nèi)容。通過這個主題你能做很多事情,讓你的應(yīng)用程序變得更加神奇。你可以在這里找到相應(yīng)的文檔:
Broadcasting – Laravel – The PHP framework for web artisans.laravel.com
其他: 在生產(chǎn)環(huán)境中運行
正如我之前所說,你必須在?laravel-echo-server.json?配置文件中禁用開發(fā)者模式。 當(dāng)然在服務(wù)器上你可以忽略這個文件,重新初始化它,因為你的主機可能和本地不同。
你還需要保持你的 Socket 服務(wù)在你的生產(chǎn)環(huán)境中運行,你可以用 Supervisor ,但是我通常使用?PM2? ,它可以方便快速的管理你的服務(wù)。 (http://pm2.keymetrics.io/)
這里是我使用?PM2 的 Socket.sh 基本配置:
#!/usr/bin/env bash laravel-echo-server start
安裝了?PM2 后, 你可以通過?pm2 start socket.sh 命令來啟動腳本,運行你的 Socket 服務(wù)。
我希望它能夠幫助到你。 這篇文章主要介紹的是一些基礎(chǔ)知識,接下來我們會繼續(xù)討論廣播路由的授權(quán)和不同的廣播頻道。
感謝你的閱讀!
英文原文地址:https://medium.com/@dennissmink/laravel-echo-server-how-to-24d5778ece8b
譯文地址:https://learnku.com/laravel/t/13101/using-laravel-echo-server-to-build-real-time-applications
更多編程相關(guān)知識,請訪問:laravel!!