摘要:本文會(huì)用簡(jiǎn)單的代碼展示一個(gè)事件廣播的過程。定義一個(gè)被廣播的事件根據(jù)文檔的說明,想讓事件被廣播,必須讓類實(shí)現(xiàn)一個(gè)接口,并且實(shí)現(xiàn)一個(gè)方法。返回一個(gè)數(shù)組,包含了事件發(fā)送到的頻道。觸發(fā)事件打開另一個(gè)頁(yè)面。
事件廣播 簡(jiǎn)介
Laravel 5.1 之中新加入了事件廣播的功能,作用是把服務(wù)器中觸發(fā)的事件通過websocket服務(wù)通知客戶端,也就是瀏覽器,客戶端js根據(jù)接受到的事件,做出相應(yīng)動(dòng)作。本文會(huì)用簡(jiǎn)單的代碼展示一個(gè)事件廣播的過程。
依賴redis
nodejs, socket.io
laravel 5.1
配置config/broadcasting.php中,如下配置"default" => env("BROADCAST_DRIVER", "redis"),,使用redis作為php和js的通信方式。
config/database.php中配置redis的連接。
根據(jù)Laravel文檔的說明,想讓事件被廣播,必須讓Event類實(shí)現(xiàn)一個(gè)IlluminateContractsBroadcastingShouldBroadcast接口,并且實(shí)現(xiàn)一個(gè)方法broadcastOn。broadcastOn返回一個(gè)數(shù)組,包含了事件發(fā)送到的channel(頻道)。如下:
namespace AppEvents; use AppEventsEvent; use IlluminateQueueSerializesModels; use IlluminateContractsBroadcastingShouldBroadcast; class SomeEvent extends Event implements ShouldBroadcast { use SerializesModels; public $user_id; /** * Create a new event instance. * * @return void */ public function __construct($user_id) { $this->user_id = $user_id; } /** * Get the channels the event should be broadcast on. * * @return array */ public function broadcastOn() { return ["test-channel"]; } }被廣播的數(shù)據(jù)
默認(rèn)情況下,Event中的所有public屬性都會(huì)被序列化后廣播。上面的例子中就是$user_id這個(gè)屬性。你也可以使用broadcastWith這個(gè)方法,明確的指出要廣播什么數(shù)據(jù)。例如:
public function broadcastWith() { return ["user_id" => $this->user_id]; }Redis和Websocket服務(wù)器
需要啟動(dòng)一個(gè)Redis,事件廣播主要依賴的就是redis的sub/pub功能,具體可以看redis文檔
需要啟動(dòng)一個(gè)websocket服務(wù)器來和client通信,建議使用socket.io,代碼如下:
var app = require("http").createServer(handler); var io = require("socket.io")(app); var Redis = require("ioredis"); var redis = new Redis("6379", "192.168.1.106"); app.listen(6001, function() { console.log("Server is running!"); }); function handler(req, res) { res.writeHead(200); res.end(""); } io.on("connection", function(socket) { console.log("connected"); }); redis.psubscribe("*", function(err, count) { console.log(count); }); redis.on("pmessage", function(subscribed, channel, message) { console.log(subscribed); console.log(channel); console.log(message); message = JSON.parse(message); io.emit(channel + ":" + message.event, message.data); });
這里需要注意的是redis.on方法的定義,接收到消息后,給client發(fā)送一個(gè)事件,事件名稱為channel + ":" + message.event。
客戶端代碼客戶端我們也使用socket.io,作為測(cè)試,代碼盡量簡(jiǎn)化,僅僅打印一個(gè)接受到的數(shù)據(jù)即可。如下:
var socket = io("http://localhost:6001"); socket.on("connection", function (data) { console.log(data); }); socket.on("test-channel:AppEventsSomeEvent", function(message){ console.log(message); }); console.log(socket);服務(wù)器觸發(fā)事件
直接在router中定義個(gè)事件觸發(fā)即可。如下:
Route::get("/event", function(){ Event::fire(new AppEventsSomeEvent(3)); return "hello world"; });測(cè)試
啟動(dòng)redis
啟動(dòng)websocket
打開帶有客戶端代碼的頁(yè)面,可以看到websocket已經(jīng)連接成功。
觸發(fā)事件,打開另一個(gè)頁(yè)面 localhost/event。
這時(shí)就可以發(fā)現(xiàn),第一個(gè)頁(yè)面的console中打印出了Object{user_id: 3},說明廣播成功。
我錄了一個(gè)教學(xué)視頻,大家如有不明白可以參考這個(gè)視頻。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/20968.html
摘要:即時(shí)交互的應(yīng)用在現(xiàn)代的應(yīng)用中很多場(chǎng)景都需要運(yùn)用到即時(shí)通訊,比如說最常見的支付回調(diào),與三方登錄。在生成事件時(shí),已經(jīng)自動(dòng)添加了該命名空間,該契約只約束方法。會(huì)將事件中的允許公開訪問的數(shù)據(jù)通過給定的頻道發(fā)布出去。 即時(shí)交互的應(yīng)用 在現(xiàn)代的 Web 應(yīng)用中很多場(chǎng)景都需要運(yùn)用到即時(shí)通訊,比如說最常見的支付回調(diào),與三方登錄。這些業(yè)務(wù)場(chǎng)景都基本需要遵循以下流程: 客戶端觸發(fā)相關(guān)業(yè)務(wù),并產(chǎn)生第三方應(yīng)...
摘要:重點(diǎn)是在頁(yè)面寫入新文本,頁(yè)面不能實(shí)時(shí)顯示。想要了解更多可以參考這篇文章基于驅(qū)動(dòng)的事件廣播下測(cè)試實(shí)時(shí)功能刷新頁(yè)面,并觀察數(shù)據(jù)庫(kù)。測(cè)試實(shí)時(shí)創(chuàng)建功能。 說明:本文主要來源于real-time-apps-laravel-5-1-event-broadcasting 本文主要基于Laravel的Model Event介紹該框架的實(shí)時(shí)通信功能,Laravel模型的生命周期中包含事件:created...
摘要:廣播廣播是這樣的一個(gè)機(jī)制它允許不同維度的張量進(jìn)行加法或者乘法運(yùn)算。如上圖,廣播一個(gè)行矩陣。和分別表示和指明沿著哪個(gè)維度可以進(jìn)行廣播。如果第二個(gè)參數(shù)是向量,它的形狀為,以及它的廣播模式為。當(dāng)可用的時(shí)候,廣播信息將會(huì)以變量的類型給出。 廣播(Broadcasting) 廣播是這樣的一個(gè)機(jī)制:它允許不同維度的張量進(jìn)行加法或者乘法運(yùn)算。在運(yùn)算時(shí),他將會(huì)沿著維度缺失的方向復(fù)制較小的那個(gè)張量。 通...
摘要:在國(guó)內(nèi),個(gè)人還是不推薦使用,訪問速度有所影響,而且其還是一個(gè)商業(yè)產(chǎn)品。今天利用最簡(jiǎn)便的步,走一遍代碼集成和來使用。代碼簡(jiǎn)單創(chuàng)建監(jiān)聽我們?cè)诤蠖颂砑右粋€(gè)被創(chuàng)建的事件,并繼承。 showImg(https://segmentfault.com/img/remote/1460000015801244?w=904&h=241); 先飚幾句英文,說說 Laravel Echo 的作用: One o...
閱讀 2654·2021-11-17 17:00
閱讀 1941·2021-10-11 10:57
閱讀 3785·2021-09-09 11:33
閱讀 951·2021-09-09 09:33
閱讀 3578·2019-08-30 14:20
閱讀 3358·2019-08-29 11:25
閱讀 2831·2019-08-26 13:48
閱讀 767·2019-08-26 11:52