即時互動的應用
在現代的 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 事件類別用來在使用者掃描微信登入後進行廣播:
<?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相關技術文章,請造訪###Laravel框架入門教學###專欄進行學習! ###以上是Laravel 即時應用的一種實作方式的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Laravel受歡迎的原因包括其簡化開發過程、提供愉快的開發環境和豐富的功能。 1)它吸收了RubyonRails的設計理念,結合PHP的靈活性。 2)提供瞭如EloquentORM、Blade模板引擎等工具,提高開發效率。 3)其MVC架構和依賴注入機制使代碼更加模塊化和可測試。 4)提供了強大的調試工具和性能優化方法,如緩存系統和最佳實踐。

Django和Laravel都是全棧框架,Django適合Python開發者和復雜業務邏輯,Laravel適合PHP開發者和優雅語法。 1.Django基於Python,遵循“電池齊全”哲學,適合快速開發和高並發。 2.Laravel基於PHP,強調開發者體驗,適合小型到中型項目。

PHP和Laravel不是直接可比的,因為Laravel是基於PHP的框架。 1.PHP適合小型項目或快速原型開發,因其簡單直接。 2.Laravel適合大型項目或高效開發,因其提供豐富功能和工具,但學習曲線較陡,性能可能不如純PHP。

laravelisabackendframeworkbuiltonphp,設計ForweBapplicationDevelopment.itfocusessonserver-sideLogic,databasemagemention和Applicationstructure和CanBeintegratedWithFrontendTechnologiesLikeLikeVue.jsorreActeReacterVue.jsorreActforforfull-stackDevefloct。

本文討論了Laravel中的創建和使用自定義刀片指令以增強模板。它涵蓋了定義指令,在模板中使用它們,並在大型項目中管理它們,強調了改進的代碼可重複性和R等好處

本文討論了使用組件在Laravel中創建和自定義可重複使用的UI元素,從而為組織提供最佳實踐並建議增強包裝。

文章討論了使用Laravel的路由來創建SEO友好的URL,涵蓋最佳實踐,規範的URL和SEO優化工具。WordCount:159

Laravel的工匠控制台可以自動化任務,例如生成代碼,運行遷移和調度。關鍵命令包括:控制器,遷移和DB:種子。可以為特定需求創建自定義命令,增強工作流效率。


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

SublimeText3漢化版
中文版,非常好用

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。