最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Laravel學(xué)習(xí)教程之廣播模塊詳解

 更新時(shí)間:2017年08月22日 10:53:28   作者:GreenLightt  
這篇文章主要給大家介紹了關(guān)于Laravel學(xué)習(xí)教程之廣播模塊的相關(guān)資料,廣播是指發(fā)送方發(fā)送一條消息,訂閱頻道的各個(gè)接收方都能及時(shí)收到消息,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來(lái)一起看看吧。

前言

本文主要給大家介紹了關(guān)于Laravel廣播模塊的相關(guān)內(nèi)容,分享出來(lái)供大家參考學(xué)習(xí),下面話不多說(shuō)了,來(lái)一起看看詳細(xì)的介紹:

注意:本文是基于Laravel 5.4版本的路由模塊代碼進(jìn)行分析書寫;

簡(jiǎn)介

廣播是指發(fā)送方發(fā)送一條消息,訂閱頻道的各個(gè)接收方都能及時(shí)收到消息;比如 A同學(xué)寫了一篇文章,這時(shí)候 B同學(xué)在文章底下評(píng)論了,A同學(xué)在頁(yè)面上是不用刷新就能收到提示有文章被評(píng)論了,這個(gè)本質(zhì)上就是A同學(xué)收到了廣播消息,這個(gè)廣播消息是由B同學(xué)評(píng)論這個(gè)動(dòng)作觸發(fā)了發(fā)送廣播消息;

在整個(gè)廣播行為中,有一個(gè)重要的概念叫頻道channel,頻道的類型有

  • 公共頻道public
  • 私有頻道private
  • 存在頻道presence

移動(dòng)端訂閱了公共頻道public,會(huì)直接提示成功;私有頻道private和存在頻道presence在進(jìn)行訂閱的過(guò)程中,會(huì)向服務(wù)器端發(fā)送權(quán)限驗(yàn)證,看是不是有權(quán)限可以訂閱該頻道;私有頻道private和存在頻道presence的區(qū)別在于,私有頻道private能夠接收其他成員發(fā)送的消息,而存在頻道presence除此之外,還能夠在用戶的加入與離開時(shí)接收信息;

廣播適合以下場(chǎng)景:

  • 通知(Notification) 或 信號(hào)(Signal)
  • 通知是最簡(jiǎn)單的示例,也最經(jīng)常用到。信號(hào)也可看作是通知的一種展現(xiàn)形式,只不過(guò)信號(hào)沒有UI而已。
  • Activity Streams
  • Activity Streams(feeds)是社交網(wǎng)絡(luò)的核心。如微信朋友圈的點(diǎn)贊和評(píng)論,A可以實(shí)時(shí)看到B的點(diǎn)贊,B可以實(shí)時(shí)看到A的評(píng)論。
  • 聊天
  • 聊天信息的實(shí)時(shí)顯示

模塊組成


Demo

日志驅(qū)動(dòng)

配置

.env文件修改或添加一行:BROADCAST_DRIVER=log;

廣播

直接調(diào)用

 $manager = app(Illuminate\Broadcasting\BroadcastManager::class);
 $driver = $manager->connection();
 // 第一個(gè)參數(shù)是頻道名,第二個(gè)參數(shù)是事件名,第三個(gè)參數(shù)是廣播內(nèi)容
 $driver->broadcast(['channel_1', 'channel_2'], 'login', ['message' => 'hello world']);

因?yàn)槭侨罩掘?qū)動(dòng),所以廣播內(nèi)容會(huì)寫到框架配置的日志文件中,輸出消息如下所示

[2017-08-18 20:45:49] local.INFO: Broadcasting [login] on channels [channel_1, channel_2] with payload:
{
 "message": "hello world"
} 

監(jiān)聽事件廣播

這種調(diào)用方式,是當(dāng)實(shí)現(xiàn)ShouldBroadcast接口的事件被觸發(fā)時(shí),則會(huì)進(jìn)行廣播操作;(同時(shí),還有一個(gè)接口叫ShouldBroadcastNow,與ShouldBroadcast接口的不同在于,將實(shí)現(xiàn)ShouldBroadcastNow接口的事件放入隊(duì)列中時(shí),會(huì)被放入叫sync的隊(duì)列中)

舉個(gè)例子,

第一步,Illuminate\Auth\Events\Login事件是用戶登錄成功后會(huì)觸發(fā)的事件,略作改動(dòng),讓其實(shí)現(xiàn)廣播功能;

class Login implements ShouldBroadcast {
 ......
 
 // 定義事件被觸發(fā)時(shí),廣播頻道;此處定義名為 first-channel 的私有頻道
 public function broadcastOn() {
  return [
   new PrivateChannel('first-channel'),
  ];
 }
 
 // 自定義廣播名稱;如果方法未定義,默認(rèn)以類名為事件名,此處的默認(rèn)值是 Illuminate\Auth\Events\Login
 public function broadcastAs() {
  return 'login';
 }
}

第二步,注冊(cè)事件監(jiān)聽;在app/Providers/EventServiceProvider.php中修改:

protected $listen = [
 ......
 'Illuminate\Auth\Events\Login' => [
  'App\Listeners\UserLogin',
 ],
];

文件app/Listeners/UserLogin.php粗糙地實(shí)現(xiàn)了一下:

class UserLogin {
 public function __construct() {}
 
 public function handle(Login $event){
  \Log::info('Do UserLogin Listener: I was Login');
 }
}

第三步,觸發(fā)事件,發(fā)送廣播;有好幾種觸發(fā)廣播方式:

直接事件觸發(fā)

event(new Illuminate\Auth\Events\Login($user, true));

幫助函數(shù)broadcast,間接觸發(fā)事件

broadcast(new Illuminate\Auth\Events\Login($user, true));

廣播管理類,間接觸發(fā)事件,直接廣播

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$manager->event(new Illuminate\Auth\Events\Login($user, true));

廣播管理類,間接觸發(fā)事件,放入隊(duì)列

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$manager->queue(new Illuminate\Auth\Events\Login($user, true));

Pusher驅(qū)動(dòng)

Pusher是一個(gè)第三方服務(wù),服務(wù)器發(fā)送廣播時(shí),會(huì)向Pusher發(fā)送請(qǐng)求,再通過(guò)Pusher與瀏覽器或移動(dòng)端保持的長(zhǎng)連接進(jìn)行數(shù)據(jù)交互;

配置

通過(guò)Pusher官網(wǎng)注冊(cè)用戶信息,獲取屬于自已的一套密鑰信息,修改.env的配置文件;

BROADCAST_DRIVER=pusher
PUSHER_APP_ID=xxxxxxxxxxxxxxxxxxxxxx
PUSHER_APP_KEY=xxxxxxxxxxxxxxxxxxxxxx
PUSHER_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxx

準(zhǔn)備工作

事件監(jiān)聽

后臺(tái)的事件監(jiān)聽還是采用"日志驅(qū)動(dòng)"部分的登錄例子;

前端

前端頁(yè)面引入以下代碼:

<script src="https://js.pusher.com/4.1/pusher.min.js"></script>

<script>
// 打開 Pusher 的調(diào)試日志
Pusher.logToConsole = true;

// 定義 Pusher 變量
var pusher = new Pusher('PUSHER_APP_KEY的值', {
 cluster: 'ap1',
 encrypted: true
});

// 定義頻道,綁定事件
var channel = pusher.subscribe('private-first-channel');
channel.bind('login', function(data) {
 alert(data);
});
</script>

如果訂閱的是公共頻道,則不會(huì)向服務(wù)器端請(qǐng)求權(quán)限檢查;如果是私有頻道(頻道名是以private-開頭)或存在頻道(頻道名是以presence-開頭),則會(huì)發(fā)出權(quán)限檢查請(qǐng)求;對(duì)應(yīng)的后端需要定義私有頻道和存在頻道的權(quán)限;

頻道權(quán)限定義

頻道的權(quán)限定義是在routes/channels.php里;此處筆者為first-channel頻道定義權(quán)限回調(diào)函數(shù):

Broadcast::channel('first-channel', function ($user) {
  return (int) $user->id === 1;
});

有讀者會(huì)疑問,前端頁(yè)面訂閱的頻道不是private-first-channel嗎?怎么后端只定義first-channel頻道的權(quán)限呢?那是因?yàn)椋蠖硕x的頻道假設(shè)是A,那么在Pusher及瀏覽器端或移動(dòng)端傳遞的私有頻道名為private-A,存在頻道則會(huì)是presence-A;

廣播

直接廣播

$manager = app(Illuminate\Broadcasting\BroadcastManager::class);
$driver = $manager->connection();
// socket 參數(shù)是廣播私有頻道時(shí)排除的 socket, 每個(gè)瀏覽器端或者移動(dòng)端在建立 websocket 時(shí)都會(huì)被分配一個(gè) socket_id
$driver->broadcast(['private-first-channel'], 'login', ['user' => ['name' => 'hello'], 'socket' => '5395.4377611']);

間接廣播

參考“日志驅(qū)動(dòng)”提及的間接廣播方式;

如果要發(fā)送排我廣播(也就是除了當(dāng)前請(qǐng)求的這個(gè)客戶端不收到廣播消息),則需要以下條件:

  • 事件使用Illuminate\Broadcasting\InteractsWithSockets trait;
  • 前端發(fā)送過(guò)來(lái)的請(qǐng)求頭部要攜帶X-Socket-ID信息;
  • 事件觸發(fā)執(zhí)行broadcast(new Illuminate\Auth\Events\Login($user, true))->toOthers();

Redis驅(qū)動(dòng)

配置

.env文件修改或添加一行:BROADCAST_DRIVER=redis;

廣播

原理是同樣在后端部署一個(gè)Socket.IO服務(wù)器,Laravel框架會(huì)發(fā)布消息到Socket.IO服務(wù)器上,由Socket.IO服務(wù)器同瀏覽器端或者移動(dòng)端保持長(zhǎng)連接;

這部分筆者尚未demo,網(wǎng)上入門資料還是挺多的,知道原理,這部分動(dòng)作上手就容易多了;

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

附錄

同類型的文章可參考以下,加深了解:

相關(guān)文章

  • ThinkPHP3.1新特性之內(nèi)容解析輸出詳解

    ThinkPHP3.1新特性之內(nèi)容解析輸出詳解

    以往版本的ThinkPHP對(duì)于模板文件保存在數(shù)據(jù)庫(kù)里面的情況下,無(wú)法進(jìn)行模板文件讀取的。這篇文章主要介紹了ThinkPHP3.1新特性的內(nèi)容解析輸出,需要的朋友可以參考下
    2014-06-06
  • Yii2中多表關(guān)聯(lián)查詢hasOne hasMany的方法

    Yii2中多表關(guān)聯(lián)查詢hasOne hasMany的方法

    這篇文章主要介紹了Yii2中多表關(guān)聯(lián)查詢hasOne hasMany的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-02-02
  • IIS服務(wù)器中部署PHP案例詳解

    IIS服務(wù)器中部署PHP案例詳解

    這篇文章主要介紹了IIS服務(wù)器中部署PHP案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • PHP類中的魔術(shù)方法(Magic Method)簡(jiǎn)明總結(jié)

    PHP類中的魔術(shù)方法(Magic Method)簡(jiǎn)明總結(jié)

    這篇文章主要介紹了PHP類中的魔術(shù)方法(Magic Method)簡(jiǎn)明總結(jié),這些方法包括__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__toString()等,需要的朋友可以參考下
    2014-07-07
  • PHP中實(shí)現(xiàn)crontab代碼分享

    PHP中實(shí)現(xiàn)crontab代碼分享

    這篇文章主要介紹了PHP中實(shí)現(xiàn)crontab代碼分享,本文給出了實(shí)現(xiàn)代碼和使用方法,需要的朋友可以參考下
    2015-03-03
  • 神盾加密解密教程(二)PHP 神盾解密

    神盾加密解密教程(二)PHP 神盾解密

    前些日子一個(gè)朋友丟了個(gè)shell給我,讓我?guī)兔饷?,打開源碼看了下寫著是 “神盾加密” , 牛逼閃閃的樣子、 百度下發(fā)現(xiàn)神盾是個(gè)很古老的東西,最后一次更新是在 2012-10-09。和他相似的另一款是phpjm,有人說(shuō)是神盾抄襲phpjm的,這些都不是我們所要關(guān)心的問題、phpjm一直在更新,而神盾貌似不搞了,我們分析下神盾,順便寫成工具,方便大家使用(因?yàn)樗桓?,所以就不用?dān)心解密工具失效問題了)。
    2014-06-06
  • ecshop適應(yīng)在PHP7的修改方法解決報(bào)錯(cuò)的實(shí)現(xiàn)

    ecshop適應(yīng)在PHP7的修改方法解決報(bào)錯(cuò)的實(shí)現(xiàn)

    下面小編就為大家?guī)?lái)一篇ecshop適應(yīng)在PHP7的修改方法解決報(bào)錯(cuò)的實(shí)現(xiàn)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2016-11-11
  • 淺析ThinkPHP中execute和query方法的區(qū)別

    淺析ThinkPHP中execute和query方法的區(qū)別

    初學(xué)ThinkPHP的時(shí)候,很多人都對(duì)execute()和query()方法的區(qū)別搞不懂,本文就此淺析二者的區(qū)別,需要的朋友可以參考下
    2014-06-06
  • Yii2中添加全局函數(shù)的方法分析

    Yii2中添加全局函數(shù)的方法分析

    這篇文章主要介紹了Yii2中添加全局函數(shù)的方法,結(jié)合實(shí)例形式對(duì)比分析了2種添加全局函數(shù)的實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-05-05
  • PHP編程 SSO詳細(xì)介紹及簡(jiǎn)單實(shí)例

    PHP編程 SSO詳細(xì)介紹及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了PHP編程 SSO詳細(xì)介紹及簡(jiǎn)單實(shí)例的相關(guān)資料,這里介紹了三種模式跨子域單點(diǎn)登陸、完全跨單點(diǎn)域登陸、站群共享身份認(rèn)證,需要的朋友可以參考下
    2017-01-01

最新評(píng)論

峨边| 葵青区| 丰城市| 富蕴县| 老河口市| 揭西县| 崇信县| 台州市| 兴宁市| 海安县| 蓝山县| 翁源县| 沧州市| 雷山县| 滁州市| 绥江县| 彰化县| 夏津县| 凭祥市| 剑川县| 开原市| 扶余县| 奉化市| 兰溪市| 行唐县| 历史| 阜阳市| 平谷区| 长顺县| 沂南县| 大庆市| 微博| 建始县| 建阳市| 闻喜县| 犍为县| 鹤岗市| 皮山县| 呼玛县| 岳西县| 宝应县|