這篇文章主要為大家介紹了關於Laravel建構即時應用的一種實作方法,即時通訊在我們日常的開發中經常會遇到,本文透過範例程式碼介紹的非常詳細,需要的朋友們可以參考借鑒,下面隨著小編來一起學習學習吧。
即時互動的應用程式
大家應該都有所體會,在現代的Web 應用程式中很多場景都需要運用到即時通訊,比如說最常見的支付回調,與三方登入。這些業務場景都基本上需要遵循以下流程:
客戶端觸發相關業務,並產生第三方應用程式的操作(例如支付)
在過去,為了實現這種即時通訊,能讓客戶端正確回應處理結果,最常用的技術就是輪詢,因為HTTP 協定的單向性,客戶端只能一再的主動詢問服務端的處理結果。這種方式有顯見的缺陷,佔用服務端資源不說,還不能即時獲得服務端處理結果。 現在,我們可以使用 WebSocket 協議來處理即時交互,它是一種雙向協議,允許服務端主動推送訊息到客戶端。本篇我們將藉助 Laravel 強大的事件系統來建構即時的互動。你將需要用到以下知識:
Laravel Event#Redis##Socket.io
Node.js
#Redis
在開始之前,我們需要開啟一個redis 服務,並在Laravel 應用程式中進行設定啟用,因為在整個流程中,我們需要藉助redis 的訂閱和發布機制來實現即時通訊。 Redis 是一個開源高效的鍵值對儲存系統。它通常作為一個資料結構伺服器來儲存鍵值對,它可以支援字串,散列,列表,集合和有序結合。在 Laravel 中使用 Redis 你需要用透過 Composer 來安裝 predis/predis 套件檔案。設定
Redis 在應用程式中的設定檔儲存在config/database.php,在這個檔案中,你可以看到一個包含了Redis 服務資訊的redis 陣列:
'redis' => [
'cluster' => false,
'default' => [
'host' => '127.0.0.1',
'port' => 6379,
'database' => 0,
],
]
Laravel Event
這裡我們需要藉助Laravel 強大的活動廣播能力:
為了幫助你建立這種類型的應用程式。 Laravel 讓透過 WebSocket 連線進行廣播事件變的非常簡單。 Laravel 允許你廣播事件來共享事件的名稱到你的服務端和客戶端的 JavaScript 框架。
設定
所有的事件廣播設定選項都會儲存在 config/broadcasting.php 設定檔中。 Laravel 附帶了幾種可用的驅動如 Pusher,Redis,和 Log,我們將使用 Redis 作為廣播驅動,這裡需要依賴 predis/predis 類別庫。
由於預設的廣播驅動程式使用的是 pusher,所以我們需要在 .env 檔案中設定
BROADCAST_DRIVER=redis
我們建立一個WechatLoginedEvent 事件類別用來在使用者掃描微信登入後進行廣播:
<?php namespace App\Events; use App\Events\Event; use Illuminate\Queue\SerializesModels; use Illuminate\Contracts\Broadcasting\ShouldBroadcast; class WechatLoginedEvent extends Event implements ShouldBroadcast { use SerializesModels; public $token; protected $channel; /** * Create a new event instance. * * @param string $token * @param string $channel * @return void */ public function __construct($token, $channel) { $this->token = $token; $this->channel = $channel; } /** * Get the channels the event should be broadcast on. * * @return array */ public function broadcastOn() { return [$this->channel]; } /** * Get the name the event should be broadcast on. * * @return string */ public function broadcastAs() { return 'wechat.login'; } }
event(new WechatLoginedEvent($token, $channel));
/** * Get the data to broadcast. * * @return array */ public function broadcastWith() { return ['user' => $this->user->id]; }
对于发布出去的信息,我们需要一个服务来对接,让其能对 redis 的发布能够进行订阅,并且能把信息以 WebSocket 协议转发出去,这里我们可以借用 Node.js 和 socket.io 来非常方便的构建这个服务:
// server.js var app = require('http').createServer(handler); var io = require('socket.io')(app); var Redis = require('ioredis'); var redis = new Redis(); app.listen(6001, function () { console.log('Server is running!') ; }); function handler(req, res) { res.writeHead(200); res.end(''); } io.on('connection', function (socket) { socket.on('message', function (message) { console.log(message) }) socket.on('disconnect', function () { console.log('user disconnect') }) }); redis.psubscribe('*', function (err, count) { }); redis.on('pmessage', function (subscrbed, channel, message) { message = JSON.parse(message); io.emit(channel + ':' + message.event, message.data); });
这里我们使用 Node.js 引入 socket.io 服务端并监听 6001 端口,借用 redis 的 psubscribe 指令使用通配符来快速的批量订阅,接着在消息触发时将消息通过 WebSocket 转发出去。
Socket.io 客户端
在 web 前端,我们需要引入 Socket.io 客户端开启与服务端 6001 端口的通讯,并订阅频道事件:
// client.js let io = require('socket.io-client') var socket = io(':6001') socket.on($channel + ':wechat.login', (data) => { socket.close() // save user token and redirect to dashboard })
至此整个通讯闭环结束,开发流程看起来就是这样的:
在 Laravel 中构建一个支持广播通知的事件
设置需要进行广播的频道及事件名称
将广播设置为使用 redis 驱动
提供一个持续的服务用于订阅 redis 的发布,及将发布内容通过 WebSocket 协议推送到客户端
客户端打开服务端 WebSocket 隧道,并对事件进行订阅,根据指定事件的推送进行响应。
以上是Laravel建置即時應用的實作方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!