摘要:概述這是關(guān)于學(xué)習(xí)的第三篇文章的應(yīng)用。第二篇的應(yīng)用第一篇的應(yīng)用什么是是一種在單個(gè)連接上進(jìn)行全雙工通信的協(xié)議。如果想了解的知識(shí),請(qǐng)看第二篇的應(yīng)用。溫馨提示本僅僅是簡(jiǎn)單的實(shí)現(xiàn),如需應(yīng)用到真實(shí)場(chǎng)景中還要多做優(yōu)化。
概述
這是關(guān)于 Swoole 學(xué)習(xí)的第三篇文章:Swoole WebSocket 的應(yīng)用。
第二篇:Swoole Task 的應(yīng)用
第一篇:Swoole Timer 的應(yīng)用
什么是 WebSocket ?
WebSocket 是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。
WebSocket 使得客戶端和服務(wù)器之間的數(shù)據(jù)交換變得更加簡(jiǎn)單,允許服務(wù)端主動(dòng)向客戶端推送數(shù)據(jù)。
在 WebSocket API 中,瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就直接可以創(chuàng)建持久性的連接,并進(jìn)行雙向數(shù)據(jù)傳輸。
我們利用 WebSocket 進(jìn)行及時(shí)通訊,今天實(shí)現(xiàn)一個(gè) 視頻彈幕效果。
實(shí)現(xiàn)彈幕其實(shí)就和群聊類似,將消息推送給所有的客戶端,只不過(guò)前端的展示所有不同。
本地版本:
后端 PHP 7.2.6、Swoole 4.3.1。
前端 HTML5 WebSocket、Canvas。
廢話不多說(shuō),先看效果。
批量版:
手動(dòng)版:
代碼server.php
serv = new swoole_websocket_server("0.0.0.0", 9501); $this->serv->set([ "worker_num" => 2, //開啟2個(gè)worker進(jìn)程 "max_request" => 4, //每個(gè)worker進(jìn)程 max_request設(shè)置為4次 "task_worker_num" => 4, //開啟4個(gè)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ù)已啟動(dòng)".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 = "我來(lái)了..."; 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); //長(zhǎng)度最大不得超過(guò)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)實(shí)現(xiàn)的。
單聊:
$serv->push($fd, $msg);
群聊:
foreach ($serv->connections as $fd) { $serv->push($fd, $msg); }
二、發(fā)送消息為什么要放到Task中,封裝一個(gè)普通方法不行嗎?
不能封裝成一個(gè)普通的方法,要放在Task中使用多進(jìn)程執(zhí)行。
如果想了解 Swoole Task 的知識(shí),請(qǐng)看: 第二篇:Swoole Timer 的應(yīng)用。
三、如何模擬批量彈幕效果?
可以使用 swoole_timer_tick ,比如:
swoole_timer_tick(50, function () use($serv){ $serv->task([ "type" => "login" ]); });
四、前端使用的哪個(gè)彈幕插件?還有沒(méi)有其他的?
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)擊如上圖中的 “全屏” 時(shí),彈幕就不顯示了,因?yàn)檫@時(shí)全屏的視頻已經(jīng)脫離了HTML文檔,具體能否實(shí)現(xiàn)大家可以研究研究(記得考慮 PC、Android、iOS 等兼容性)。
也可以用“偽全屏”進(jìn)行實(shí)現(xiàn),自定義一個(gè)全屏按鈕,點(diǎn)擊時(shí)讓當(dāng)前頁(yè)面全屏,同時(shí)讓視頻尺寸變大。
六、看了這篇文章,單聊和群聊都會(huì)了,能實(shí)現(xiàn)一個(gè)在線IM嗎?
不能。
真正使用的在線IM系統(tǒng),需求落地時(shí)比我們想象到要復(fù)雜的多,自己深入研究沒(méi)問(wèn)題,想開發(fā)一套生產(chǎn)環(huán)境用的IM系統(tǒng),需要慎重,特別是后端用PHP。
如果急需在線IM系統(tǒng),可以使用市面上專業(yè)的IM系統(tǒng)。
七、彈幕有什么應(yīng)用場(chǎng)景?
比如,辦年會(huì)或活動(dòng)開場(chǎng)時(shí)大家可以利用彈幕活躍氣氛,使用微信掃碼登錄后進(jìn)行發(fā)送實(shí)時(shí)彈幕,還可以應(yīng)用到直播,只要覺(jué)得合理都可以使用。
八、Swoole WebSocket 入門還可以實(shí)現(xiàn)什么案例?
可以實(shí)現(xiàn)聊天室功能、直播功能、掃碼登錄功能等。
溫馨提示
本 Demo 僅僅是簡(jiǎn)單的實(shí)現(xiàn),如需應(yīng)用到真實(shí)場(chǎng)景中還要多做優(yōu)化。
需要Demo源碼的,關(guān)注公眾號(hào),回復(fù)“swoole 彈幕”即可。
推薦閱讀系統(tǒng)的講解 - SSO 單點(diǎn)登錄
系統(tǒng)的講解 - PHP WEB 安全防御
系統(tǒng)的講解 - PHP 緩存技術(shù)
系統(tǒng)的講解 - PHP 接口簽名驗(yàn)證
系統(tǒng)的講解 - PHP 浮點(diǎn)數(shù)高精度運(yùn)算
本文歡迎轉(zhuǎn)發(fā),轉(zhuǎn)發(fā)請(qǐng)注明作者和出處,謝謝!
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/31460.html
摘要:那么,是否就無(wú)法用來(lái)開發(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é)議,只能接收客戶端的請(qǐng)求,然后響應(yīng)請(qǐng)求,不能主動(dòng)向客戶端推送信息。因此,一些實(shí)時(shí)性要求比較高的應(yīng)用,如實(shí)時(shí)聊天、直播應(yīng)用、在線網(wǎng)頁(yè)游戲等,就不適合采用HTTP協(xié)議...
摘要:那么,是否就無(wú)法用來(lái)開發(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é)議,只能接收客戶端的請(qǐng)求,然后響應(yīng)請(qǐng)求,不能主動(dòng)向客戶端推送信息。因此,一些實(shí)時(shí)性要求比較高的應(yīng)用,如實(shí)時(shí)聊天、直播應(yīng)用、在線網(wǎng)頁(yè)游戲等,就不適合采用HTTP協(xié)議...
摘要:概述這是關(guān)于入門學(xué)習(xí)的第十篇文章壓測(cè)性能。測(cè)試機(jī)上安裝的虛擬機(jī)系統(tǒng)內(nèi)存數(shù)量核數(shù)數(shù)量大小代碼壓測(cè)腳本并發(fā)量請(qǐng)求量壓測(cè)結(jié)果第次第次第次以上是壓測(cè)結(jié)果,供參考。小結(jié)通過(guò)這個(gè)壓測(cè)結(jié)果,表明的執(zhí)行效率是杠杠的當(dāng)然還有一些參數(shù)是可以調(diào)優(yōu)的,比如等。 概述 這是關(guān)于 Swoole 入門學(xué)習(xí)的第十篇文章:壓測(cè) swoole_websocket_server 性能。 第九篇:Swoole Redis ...
摘要:是一個(gè)基于擴(kuò)展實(shí)現(xiàn)的輕量級(jí)高性能的常駐內(nèi)存型的和應(yīng)用服務(wù)框架高度封裝了,,服務(wù)器,以及基于實(shí)現(xiàn)可擴(kuò)展的服務(wù),同時(shí)支持包方式安裝部署項(xiàng)目。基于實(shí)用,抽象事件處理類,實(shí)現(xiàn)與底層的回調(diào)的解耦,支持同步異步調(diào)用,內(nèi)置等常用組件等。 swoolefy swoolefy是一個(gè)基于swoole擴(kuò)展實(shí)現(xiàn)的輕量級(jí)高性能的常駐內(nèi)存型的API和Web應(yīng)用服務(wù)框架,高度封裝了http,websocket,ud...
摘要:概述這是關(guān)于學(xué)習(xí)的第六篇文章整合成一個(gè)小框架。相關(guān)配置,在文件夾。代碼放不全,就放一個(gè)主要的文件吧。當(dāng)然我自己也會(huì)繼續(xù)完善它,后期的一些新知識(shí)點(diǎn)會(huì)集成到這里面,做成自己迭代的小項(xiàng)目。初版比較糙,不喜勿噴。后期會(huì)新增需要源碼的,加我微信吧。 概述 這是關(guān)于 Swoole 學(xué)習(xí)的第六篇文章:Swoole 整合成一個(gè)小框架。 第五篇:Swoole 多協(xié)議 多端口 的應(yīng)用 第四篇:Swool...
閱讀 1854·2021-09-30 09:47
閱讀 3839·2021-09-22 15:05
閱讀 3027·2021-08-30 09:44
閱讀 3760·2019-08-30 15:55
閱讀 1532·2019-08-30 13:08
閱讀 1451·2019-08-29 16:40
閱讀 712·2019-08-29 12:45
閱讀 1510·2019-08-29 11:25