摘要:本文會用簡單的代碼展示一個事件廣播的過程。定義一個被廣播的事件根據文檔的說明,想讓事件被廣播,必須讓類實現一個接口,并且實現一個方法。返回一個數組,包含了事件發送到的頻道。觸發事件打開另一個頁面。
事件廣播 簡介
Laravel 5.1 之中新加入了事件廣播的功能,作用是把服務器中觸發的事件通過websocket服務通知客戶端,也就是瀏覽器,客戶端js根據接受到的事件,做出相應動作。本文會用簡單的代碼展示一個事件廣播的過程。
依賴redis
nodejs, socket.io
laravel 5.1
配置config/broadcasting.php中,如下配置"default" => env("BROADCAST_DRIVER", "redis"),,使用redis作為php和js的通信方式。
config/database.php中配置redis的連接。
根據Laravel文檔的說明,想讓事件被廣播,必須讓Event類實現一個IlluminateContractsBroadcastingShouldBroadcast接口,并且實現一個方法broadcastOn。broadcastOn返回一個數組,包含了事件發送到的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"]; } }被廣播的數據
默認情況下,Event中的所有public屬性都會被序列化后廣播。上面的例子中就是$user_id這個屬性。你也可以使用broadcastWith這個方法,明確的指出要廣播什么數據。例如:
public function broadcastWith() { return ["user_id" => $this->user_id]; }Redis和Websocket服務器
需要啟動一個Redis,事件廣播主要依賴的就是redis的sub/pub功能,具體可以看redis文檔
需要啟動一個websocket服務器來和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發送一個事件,事件名稱為channel + ":" + message.event。
客戶端代碼客戶端我們也使用socket.io,作為測試,代碼盡量簡化,僅僅打印一個接受到的數據即可。如下:
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);服務器觸發事件
直接在router中定義個事件觸發即可。如下:
Route::get("/event", function(){ Event::fire(new AppEventsSomeEvent(3)); return "hello world"; });測試
啟動redis
啟動websocket
打開帶有客戶端代碼的頁面,可以看到websocket已經連接成功。
觸發事件,打開另一個頁面 localhost/event。
這時就可以發現,第一個頁面的console中打印出了Object{user_id: 3},說明廣播成功。
我錄了一個教學視頻,大家如有不明白可以參考這個視頻。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/20968.html
摘要:即時交互的應用在現代的應用中很多場景都需要運用到即時通訊,比如說最常見的支付回調,與三方登錄。在生成事件時,已經自動添加了該命名空間,該契約只約束方法。會將事件中的允許公開訪問的數據通過給定的頻道發布出去。 即時交互的應用 在現代的 Web 應用中很多場景都需要運用到即時通訊,比如說最常見的支付回調,與三方登錄。這些業務場景都基本需要遵循以下流程: 客戶端觸發相關業務,并產生第三方應...
摘要:重點是在頁面寫入新文本,頁面不能實時顯示。想要了解更多可以參考這篇文章基于驅動的事件廣播下測試實時功能刷新頁面,并觀察數據庫。測試實時創建功能。 說明:本文主要來源于real-time-apps-laravel-5-1-event-broadcasting 本文主要基于Laravel的Model Event介紹該框架的實時通信功能,Laravel模型的生命周期中包含事件:created...
摘要:廣播廣播是這樣的一個機制它允許不同維度的張量進行加法或者乘法運算。如上圖,廣播一個行矩陣。和分別表示和指明沿著哪個維度可以進行廣播。如果第二個參數是向量,它的形狀為,以及它的廣播模式為。當可用的時候,廣播信息將會以變量的類型給出。 廣播(Broadcasting) 廣播是這樣的一個機制:它允許不同維度的張量進行加法或者乘法運算。在運算時,他將會沿著維度缺失的方向復制較小的那個張量。 通...
摘要:在國內,個人還是不推薦使用,訪問速度有所影響,而且其還是一個商業產品。今天利用最簡便的步,走一遍代碼集成和來使用。代碼簡單創建監聽我們在后端添加一個被創建的事件,并繼承。 showImg(https://segmentfault.com/img/remote/1460000015801244?w=904&h=241); 先飚幾句英文,說說 Laravel Echo 的作用: One o...
閱讀 2609·2021-11-17 17:00
閱讀 1862·2021-10-11 10:57
閱讀 3716·2021-09-09 11:33
閱讀 910·2021-09-09 09:33
閱讀 3550·2019-08-30 14:20
閱讀 3311·2019-08-29 11:25
閱讀 2795·2019-08-26 13:48
閱讀 733·2019-08-26 11:52