成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Laravel5.1 事件廣播(Event Broadcasting)

yiliang / 1920人閱讀

摘要:本文會(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的連接。

定義一個(gè)被廣播的事件

根據(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

相關(guān)文章

  • Laravel 即時(shí)應(yīng)用的一種實(shí)現(xiàn)方式

    摘要:即時(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)...

    NeverSayNever 評(píng)論0 收藏0
  • 基于Model Event模型事件的Laravel實(shí)時(shí)APP

    摘要:重點(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...

    afishhhhh 評(píng)論0 收藏0
  • Theano - 廣播(broadcasting)

    摘要:廣播廣播是這樣的一個(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è)張量。 通...

    whjin 評(píng)論0 收藏0
  • 簡(jiǎn)單 16步走一遍 Laravel Echo 的使用

    摘要:在國(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...

    chavesgu 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<