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