摘要:概述這是關(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
小結(jié)視頻彈幕Demo
一、單聊提供了方法,群聊提供方法了嗎?
官方?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
摘要:那么,是否就無法用來開發(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é)議...
摘要:那么,是否就無法用來開發(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é)議...
摘要:概述這是關(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 ...
摘要:是一個基于擴(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...
摘要:概述這是關(guān)于學(xué)習(xí)的第六篇文章整合成一個小框架。相關(guān)配置,在文件夾。代碼放不全,就放一個主要的文件吧。當(dāng)然我自己也會繼續(xù)完善它,后期的一些新知識點(diǎn)會集成到這里面,做成自己迭代的小項目。初版比較糙,不喜勿噴。后期會新增需要源碼的,加我微信吧。 概述 這是關(guān)于 Swoole 學(xué)習(xí)的第六篇文章:Swoole 整合成一個小框架。 第五篇:Swoole 多協(xié)議 多端口 的應(yīng)用 第四篇:Swool...
閱讀 1603·2021-09-30 09:47
閱讀 3608·2021-09-22 15:05
閱讀 2842·2021-08-30 09:44
閱讀 3626·2019-08-30 15:55
閱讀 1377·2019-08-30 13:08
閱讀 1332·2019-08-29 16:40
閱讀 557·2019-08-29 12:45
閱讀 1393·2019-08-29 11:25