這篇文章主要為大家介紹了關於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,
],
]
如果你修改了redis 服務的端口,請保持設定檔中的連接埠一致。
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'; } }###其中你需要注意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.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中文網其他相關文章!

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于单点登录的相关问题,单点登录是指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于Laravel的生命周期相关问题,Laravel 的生命周期从public\index.php开始,从public\index.php结束,希望对大家有帮助。

在laravel中,guard是一个用于用户认证的插件;guard的作用就是处理认证判断每一个请求,从数据库中读取数据和用户输入的对比,调用是否登录过或者允许通过的,并且Guard能非常灵活的构建一套自己的认证体系。

laravel中asset()方法的用法:1、用于引入静态文件,语法为“src="{{asset(‘需要引入的文件路径’)}}"”;2、用于给当前请求的scheme前端资源生成一个url,语法为“$url = asset('前端资源')”。

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于使用中间件记录用户请求日志的相关问题,包括了创建中间件、注册中间件、记录用户访问等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于laravel的相关知识,其中主要介绍了关于中间件的相关问题,包括了什么是中间件、自定义中间件等等,中间件为过滤进入应用的 HTTP 请求提供了一套便利的机制,下面一起来看一下,希望对大家有帮助。

laravel路由文件在“routes”目录里。Laravel中所有的路由文件定义在routes目录下,它里面的内容会自动被框架加载;该目录下默认有四个路由文件用于给不同的入口使用:web.php、api.php、console.php等。

在laravel中,scope用于处理模型中的数据,在模型中可以定义scope开头方法,这类方法可以通过模型直接调用,被称为查询作用域,语法为“public function scope首字母大写单词($query){...}”。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Safe Exam Browser
Safe Exam Browser是一個安全的瀏覽器環境,安全地進行線上考試。該軟體將任何電腦變成一個安全的工作站。它控制對任何實用工具的訪問,並防止學生使用未經授權的資源。

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),