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

資訊專欄INFORMATION COLUMN

Swoole WebSocket 的應(yīng)用

Wildcard / 1827人閱讀

摘要:概述這是關(guān)于學(xué)習(xí)的第三篇文章的應(yīng)用。第二篇的應(yīng)用第一篇的應(yīng)用什么是是一種在單個連接上進(jìn)行全雙工通信的協(xié)議。如果想了解的知識,請看第二篇的應(yīng)用。溫馨提示本僅僅是簡單的實現(xiàn),如需應(yīng)用到真實場景中還要多做優(yōu)化。

概述

這是關(guān)于 Swoole 學(xué)習(xí)的第三篇文章:Swoole WebSocket 的應(yīng)用。

第二篇:Swoole Task 的應(yīng)用

第一篇:Swoole Timer 的應(yīng)用

什么是 WebSocket ?

WebSocket 是一種在單個TCP連接上進(jìn)行全雙工通信的協(xié)議。

WebSocket 使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡單,允許服務(wù)端主動向客戶端推送數(shù)據(jù)。

在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。

我們利用 WebSocket 進(jìn)行及時通訊,今天實現(xiàn)一個 視頻彈幕效果。

實現(xiàn)彈幕其實就和群聊類似,將消息推送給所有的客戶端,只不過前端的展示所有不同。

本地版本:

后端 PHP 7.2.6、Swoole 4.3.1。

前端 HTML5 WebSocket、Canvas。

廢話不多說,先看效果。

批量版:

手動版:

代碼

server.php

serv = new swoole_websocket_server("0.0.0.0", 9501);
        $this->serv->set([
            "worker_num"      => 2, //開啟2個worker進(jìn)程
            "max_request"     => 4, //每個worker進(jìn)程 max_request設(shè)置為4次
            "task_worker_num" => 4, //開啟4個task進(jìn)程
            "dispatch_mode"   => 4, //數(shù)據(jù)包分發(fā)策略 - IP分配
            "daemonize"       => false, //守護(hù)進(jìn)程(true/false)
        ]);

        $this->serv->on("Start", [$this, "onStart"]);
        $this->serv->on("Open", [$this, "onOpen"]);
        $this->serv->on("Message", [$this, "onMessage"]);
        $this->serv->on("Close", [$this, "onClose"]);
        $this->serv->on("Task", [$this, "onTask"]);
        $this->serv->on("Finish", [$this, "onFinish"]);

        $this->serv->start();
    }

    public function onStart($serv) {
        echo "#### onStart ####".PHP_EOL;
        echo "SWOOLE ".SWOOLE_VERSION . " 服務(wù)已啟動".PHP_EOL;
        echo "master_pid: {$serv->master_pid}".PHP_EOL;
        echo "manager_pid: {$serv->manager_pid}".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onOpen($serv, $request) {
        echo "#### onOpen ####".PHP_EOL;
        echo "server: handshake success with fd{$request->fd}".PHP_EOL;
        $serv->task([
            "type" => "login"
        ]);
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onTask($serv, $task_id, $from_id, $data) {
        echo "#### onTask ####".PHP_EOL;
        echo "#{$serv->worker_id} onTask: [PID={$serv->worker_pid}]: task_id={$task_id}".PHP_EOL;
        $msg = "";
        switch ($data["type"]) {
            case "login":
                $msg = "我來了...";
                break;
            case "speak":
                $msg = $data["msg"];
                break;
        }
        foreach ($serv->connections as $fd) {
            $connectionInfo = $serv->connection_info($fd);
            if ($connectionInfo["websocket_status"] == 3) {
                $serv->push($fd, $msg); //長度最大不得超過2M
            }
        }
        $serv->finish($data);
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onMessage($serv, $frame) {
        echo "#### onMessage ####".PHP_EOL;
        echo "receive from fd{$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}".PHP_EOL;
        $serv->task(["type" => "speak", "msg" => $frame->data]);
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onFinish($serv,$task_id, $data) {
        echo "#### onFinish ####".PHP_EOL;
        echo "Task {$task_id} 已完成".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }

    public function onClose($serv, $fd) {
        echo "#### onClose ####".PHP_EOL;
        echo "client {$fd} closed".PHP_EOL;
        echo "########".PHP_EOL.PHP_EOL;
    }
}

$server = new Server();

index.php



    
        
        
        
        
        
        
        視頻彈幕Demo
        
    
    
        
        
            

小結(jié)

一、單聊提供了方法,群聊提供方法了嗎?

官方?jīng)]有提供群聊的方法,使用循環(huán)實現(xiàn)的。

單聊:

$serv->push($fd, $msg);

群聊:

foreach ($serv->connections as $fd) {
    $serv->push($fd, $msg);
}

二、發(fā)送消息為什么要放到Task中,封裝一個普通方法不行嗎?

不能封裝成一個普通的方法,要放在Task中使用多進(jìn)程執(zhí)行。

如果想了解 Swoole Task 的知識,請看: 第二篇:Swoole Timer 的應(yīng)用。

三、如何模擬批量彈幕效果?

可以使用 swoole_timer_tick ,比如:

swoole_timer_tick(50, function () use($serv){
    $serv->task([
        "type" => "login"
    ]);
});

四、前端使用的哪個彈幕插件?還有沒有其他的?

canvasBarrage.js:

http://www.zhangxinxu.com/wor...

有其他的,比如:

Jquery.barrager.js

Jquery.danmu.js

DanMuer.js

根據(jù)自己喜歡風(fēng)格,進(jìn)行嘗試吧。

五、Demo 中視頻全屏后,還顯示彈幕嗎?

不顯示。

當(dāng)點(diǎn)擊如上圖中的 “全屏” 時,彈幕就不顯示了,因為這時全屏的視頻已經(jīng)脫離了HTML文檔,具體能否實現(xiàn)大家可以研究研究(記得考慮 PC、Android、iOS 等兼容性)。

也可以用“偽全屏”進(jìn)行實現(xiàn),自定義一個全屏按鈕,點(diǎn)擊時讓當(dāng)前頁面全屏,同時讓視頻尺寸變大。

六、看了這篇文章,單聊和群聊都會了,能實現(xiàn)一個在線IM嗎?

不能。

真正使用的在線IM系統(tǒng),需求落地時比我們想象到要復(fù)雜的多,自己深入研究沒問題,想開發(fā)一套生產(chǎn)環(huán)境用的IM系統(tǒng),需要慎重,特別是后端用PHP。

如果急需在線IM系統(tǒng),可以使用市面上專業(yè)的IM系統(tǒng)。

七、彈幕有什么應(yīng)用場景?

比如,辦年會或活動開場時大家可以利用彈幕活躍氣氛,使用微信掃碼登錄后進(jìn)行發(fā)送實時彈幕,還可以應(yīng)用到直播,只要覺得合理都可以使用。

八、Swoole WebSocket 入門還可以實現(xiàn)什么案例?

可以實現(xiàn)聊天室功能、直播功能、掃碼登錄功能等。

溫馨提示

本 Demo 僅僅是簡單的實現(xiàn),如需應(yīng)用到真實場景中還要多做優(yōu)化。

需要Demo源碼的,關(guān)注公眾號,回復(fù)“swoole 彈幕”即可。

推薦閱讀

系統(tǒng)的講解 - SSO 單點(diǎn)登錄

系統(tǒng)的講解 - PHP WEB 安全防御

系統(tǒng)的講解 - PHP 緩存技術(shù)

系統(tǒng)的講解 - PHP 接口簽名驗證

系統(tǒng)的講解 - PHP 浮點(diǎn)數(shù)高精度運(yùn)算

本文歡迎轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)請注明作者和出處,謝謝!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/31460.html

相關(guān)文章

  • php只能做網(wǎng)站?基于swoole+websocket開發(fā)雙向通信應(yīng)用

    摘要:那么,是否就無法用來開發(fā)雙向通信的應(yīng)用呢答案是否定的。內(nèi)置通信支持,可以與程序基于進(jìn)行雙向通信。通信協(xié)議于年被定為標(biāo)準(zhǔn),并由補(bǔ)充規(guī)范。前言 眾所周知,PHP用于開發(fā)基于HTTP協(xié)議的網(wǎng)站應(yīng)用非常便捷。而HTTP協(xié)議是一種單向的通信協(xié)議,只能接收客戶端的請求,然后響應(yīng)請求,不能主動向客戶端推送信息。因此,一些實時性要求比較高的應(yīng)用,如實時聊天、直播應(yīng)用、在線網(wǎng)頁游戲等,就不適合采用HTTP協(xié)議...

    番茄西紅柿 評論0 收藏0
  • php只能做網(wǎng)站?基于swoole+websocket開發(fā)雙向通信應(yīng)用

    摘要:那么,是否就無法用來開發(fā)雙向通信的應(yīng)用呢答案是否定的。內(nèi)置通信支持,可以與程序基于進(jìn)行雙向通信。通信協(xié)議于年被定為標(biāo)準(zhǔn),并由補(bǔ)充規(guī)范。前言 眾所周知,PHP用于開發(fā)基于HTTP協(xié)議的網(wǎng)站應(yīng)用非常便捷。而HTTP協(xié)議是一種單向的通信協(xié)議,只能接收客戶端的請求,然后響應(yīng)請求,不能主動向客戶端推送信息。因此,一些實時性要求比較高的應(yīng)用,如實時聊天、直播應(yīng)用、在線網(wǎng)頁游戲等,就不適合采用HTTP協(xié)議...

    琛h。 評論0 收藏0
  • 壓測 swoole_websocket_server 性能

    摘要:概述這是關(guān)于入門學(xué)習(xí)的第十篇文章壓測性能。測試機(jī)上安裝的虛擬機(jī)系統(tǒng)內(nèi)存數(shù)量核數(shù)數(shù)量大小代碼壓測腳本并發(fā)量請求量壓測結(jié)果第次第次第次以上是壓測結(jié)果,供參考。小結(jié)通過這個壓測結(jié)果,表明的執(zhí)行效率是杠杠的當(dāng)然還有一些參數(shù)是可以調(diào)優(yōu)的,比如等。 概述 這是關(guān)于 Swoole 入門學(xué)習(xí)的第十篇文章:壓測 swoole_websocket_server 性能。 第九篇:Swoole Redis ...

    余學(xué)文 評論0 收藏0
  • swoolefy-基于swoole擴(kuò)展實現(xiàn)高性能常駐內(nèi)存型API和Web應(yīng)用服務(wù)框架

    摘要:是一個基于擴(kuò)展實現(xiàn)的輕量級高性能的常駐內(nèi)存型的和應(yīng)用服務(wù)框架高度封裝了,,服務(wù)器,以及基于實現(xiàn)可擴(kuò)展的服務(wù),同時支持包方式安裝部署項目?;趯嵱茫橄笫录幚眍?,實現(xiàn)與底層的回調(diào)的解耦,支持同步異步調(diào)用,內(nèi)置等常用組件等。 swoolefy swoolefy是一個基于swoole擴(kuò)展實現(xiàn)的輕量級高性能的常駐內(nèi)存型的API和Web應(yīng)用服務(wù)框架,高度封裝了http,websocket,ud...

    lewinlee 評論0 收藏0
  • Swoole 整合成一個小框架

    摘要:概述這是關(guān)于學(xué)習(xí)的第六篇文章整合成一個小框架。相關(guān)配置,在文件夾。代碼放不全,就放一個主要的文件吧。當(dāng)然我自己也會繼續(xù)完善它,后期的一些新知識點(diǎn)會集成到這里面,做成自己迭代的小項目。初版比較糙,不喜勿噴。后期會新增需要源碼的,加我微信吧。 概述 這是關(guān)于 Swoole 學(xué)習(xí)的第六篇文章:Swoole 整合成一個小框架。 第五篇:Swoole 多協(xié)議 多端口 的應(yīng)用 第四篇:Swool...

    bergwhite 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<