亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

Laravel構建即時應用的一種實現方法詳解

2024-05-04 23:59:55
字體:
來源:轉載
供稿:網友

即時交互的應用

大家應該都有所體會,在現代的 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, ],]

如果你修改了 redis 服務的端口,請保持配置文件中的端口一致。

Laravel Event

這里我們需要借助 Laravel 強大的事件廣播能力:

廣播事件

很多現代化的應用中,會使用 Web Sockets 來實現實時交互的用戶接口。當一些數據在服務端變更時,一條消息會通過 WebSocket 連接來傳遞到客戶端進行處理。

為了幫助你構建這種類型的應用。Laravel 使通過 WebSocket 連接進行廣播事件變的非常簡單。Laravel 允許你廣播事件來共享事件的名稱到你的服務端和客戶端的 JavaScript 框架。

配置

所有的事件廣播配置選項都被存儲在 config/broadcasting.php 配置文件中。Laravel 附帶了幾種可用的驅動如 Pusher,Redis,和 Log,我們將使用 Redis 作為廣播驅動,這里需要依賴 predis/predis 類庫。

由于默認的廣播驅動使用的是 pusher,所以我們需要在 .env 文件中設置 BROADCAST_DRIVER=redis。

我們創建一個 WechatLoginedEvent 事件類用來在用戶掃描微信登錄后進行廣播:

<?phpnamespace 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'; }}

其中你需要注意 broadcastOn 方法應返回一個數組,它表示所需廣播的頻道,而 broadcastAs 返回的是一個字符串,它表示廣播所觸發的事件,Laravel 默認的是返回事件類的全類名,這里是 App/Events/WechatLoginedEvent.

最重要的是你需要手動的讓該類實現 ShouldBroadcast 契約。Laravel 在生成事件時,已經自動添加了該命名空間,該契約只約束 broadcastOn 方法。

事件完成接下來就是觸發事件了,簡單的一行代碼就可以:

event(new WechatLoginedEvent($token, $channel));

這個操作會自動的觸發事件的執行并將信息廣播出去。該廣播操作底層借助了 redis 的訂閱和發布機制。

RedisBroadcaster 會將事件中的允許公開訪問的數據通過給定的頻道發布出去。如果你想對公開的數據擁有更多的控制,你可以在事件中添加 broadcastWith 方法,它應該返回一個數組:

/** * Get the data to broadcast. * * @return array */ public function broadcastWith()  { return ['user' => $this->user->id]; }

Node.js 和 Socket.io

對于發布出去的信息,我們需要一個服務來對接,讓其能對 redis 的發布能夠進行訂閱,并且能把信息以 WebSocket 協議轉發出去,這里我們可以借用 Node.js 和 socket.io 來非常方便的構建這個服務:

// server.jsvar 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.jslet 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 隧道,并對事件進行訂閱,根據指定事件的推送進行響應。

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對VeVb武林網的支持。

 

注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av综合网| 欧美成人自拍视频| 亚洲最新av在线网站| 性亚洲最疯狂xxxx高清| 亚洲精品久久久久中文字幕欢迎你| 国产在线一区二区三区| 亚洲女人天堂网| 久久777国产线看观看精品| 亚洲性生活视频在线观看| 亚洲第一中文字幕在线观看| 日韩a**中文字幕| 亚洲精品动漫久久久久| 亚洲xxxx妇黄裸体| 欧美午夜视频在线观看| 国产精品第2页| 日韩电影在线观看免费| 亚洲天天在线日亚洲洲精| 亚洲裸体xxxx| 欧美激情精品在线| 青青久久av北条麻妃海外网| 亚洲人成在线免费观看| 久久久噜噜噜久久| 国产成人精品综合久久久| 91香蕉嫩草影院入口| 亚洲国产免费av| 亚洲成人网av| 尤物99国产成人精品视频| 亚洲综合在线小说| 91高清视频免费观看| 久久久久久av| 久久激情视频久久| 亚洲网站视频福利| 91爱爱小视频k| 欧美性xxxx在线播放| 亚洲精品免费av| 国模精品视频一区二区三区| 亚洲福利在线看| 欧美激情精品久久久久久大尺度| 欧美精品www在线观看| 色偷偷9999www| 日韩av在线直播| 亚洲精品成人av| www.亚洲成人| 日韩免费黄色av| 精品毛片三在线观看| 日韩中文字幕精品| 成人在线视频福利| 国产精品丝袜久久久久久不卡| 久久亚洲欧美日韩精品专区| 亚洲专区在线视频| 国内精品视频一区| 日韩精品视频中文在线观看| 欧美性视频精品| 欧美大秀在线观看| 成人黄色av免费在线观看| 久久免费国产视频| 亚洲第一视频网| 亚洲色在线视频| 欧美洲成人男女午夜视频| 国产成人精品视频| 日韩女优人人人人射在线视频| 欧洲美女免费图片一区| 国产成人精品最新| 亚洲欧美国产一区二区三区| 91久热免费在线视频| 亚洲电影中文字幕| 91精品国产91久久久久福利| 久久全球大尺度高清视频| 日韩成人久久久| 中文字幕亚洲欧美一区二区三区| 国产精品777| 欧美性猛交xxxx免费看| 亚洲免费视频观看| 国产精品美女午夜av| 97成人精品视频在线观看| 亚洲欧美制服另类日韩| 亚洲片国产一区一级在线观看| 亚洲人成网站777色婷婷| 自拍亚洲一区欧美另类| 亚洲国产成人精品久久久国产成人一区| 国产精品高清网站| 91豆花精品一区| 亚洲免费成人av电影| 精品欧美aⅴ在线网站| 精品久久中文字幕久久av| 日韩av成人在线| 亚洲欧美自拍一区| 欧美丝袜一区二区三区| 久久九九有精品国产23| 精品一区二区三区四区| 久久6精品影院| 国产精品免费一区二区三区都可以| 热草久综合在线| 色综合色综合久久综合频道88| 亚洲免费视频一区二区| 在线看福利67194| 97视频在线观看免费| 91精品国产自产在线老师啪| 97超碰色婷婷| 国产精品视频中文字幕91| 国产精品久久久久久久久借妻| 亚洲一区二区三| 粉嫩av一区二区三区免费野| 亚洲欧美日韩另类| 在线丨暗呦小u女国产精品| 欧美电影免费观看高清完整| 欧美日韩一区二区精品| 国产精品一区二区性色av| 在线电影欧美日韩一区二区私密| 91av网站在线播放| 精品国产乱码久久久久酒店| 国产精品女主播| 成人在线免费观看视视频| 少妇激情综合网| 日韩一中文字幕| 亚洲色图校园春色| 北条麻妃一区二区在线观看| 亚洲视频在线免费观看| 中文字幕av日韩| 久久中国妇女中文字幕| 欧美日韩亚洲系列| 人人澡人人澡人人看欧美| 色噜噜亚洲精品中文字幕| 精品五月天久久| 欧美另类极品videosbestfree| 国产一区视频在线| 欧美老妇交乱视频| 色系列之999| 欧美视频精品一区| 日韩精品视频免费专区在线播放| 色多多国产成人永久免费网站| 91美女片黄在线观看游戏| 亚洲第一男人av| 亚洲精品动漫100p| 亚洲精品视频久久| 亚洲精品在线观看www| 国产一区二区三区在线观看网站| 91精品久久久久久久久久入口| 九九九久久国产免费| 色av吧综合网| 国产999视频| 亚洲嫩模很污视频| 国产一区二区在线播放| 久久精品2019中文字幕| 精品久久久免费| 欧美午夜精品久久久久久久| 岛国av一区二区在线在线观看| 亚洲电影中文字幕| 日韩av综合网| www.99久久热国产日韩欧美.com| 高清欧美性猛交xxxx黑人猛交| 91精品国产91久久久久久最新| 亚洲欧美成人网| 91免费电影网站| 欧美日韩国产影院| 亚洲美女精品成人在线视频| 久久久天堂国产精品女人| 91chinesevideo永久地址| 久久亚洲精品中文字幕冲田杏梨| 九九精品在线观看| 精品丝袜一区二区三区| 久久久久成人网| 亚洲高清免费观看高清完整版| 午夜精品久久久久久久99热浪潮|