下面由workerman教學(xué)專欄給大家介紹實(shí)作基於workerman的即時(shí)推播,拋棄ajax輪詢的方法,希望對(duì)需要的朋友有幫助!
先扯些這些內(nèi)容:
TCP/IP?
TCP/IP是個(gè)協(xié)定群組,可分為三個(gè)層次:網(wǎng)路層、傳輸層、應(yīng)用層。?
在網(wǎng)路層有IP協(xié)定、ICMP協(xié)定、ARP協(xié)定、RARP協(xié)定和BOOTP協(xié)定。?
在傳輸層中有TCP協(xié)定與UDP協(xié)定。
在應(yīng)用層有:
TCP包含F(xiàn)TP、HTTP、TELNET、SMTP等協(xié)定?
UDP包含DNS、TFTP等協(xié)定?
短連線?
連線->傳輸資料->關(guān)閉連線?
HTTP是無(wú)狀態(tài)的,瀏覽器和伺服器每進(jìn)行一次HTTP操作,就建立一次連接,但任務(wù)結(jié)束就中斷連線。?
也可以這樣說(shuō):短連線是指SOCKET連線後發(fā)送後接收完資料後馬上斷開(kāi)連線。?
??
長(zhǎng)連線?
連線->傳送資料->保持連線 -> 傳送資料-> 。 。 。 ->關(guān)閉連線。?
長(zhǎng)連接指建立SOCKET連接後不管是否使用都保持連接,但安全性較差。?
??
http的長(zhǎng)連線?
HTTP也可以建立長(zhǎng)連線的,使用Connection:keep-alive,HTTP 1.1預(yù)設(shè)進(jìn)行持久連線。 HTTP1.1和HTTP1.0相比較而言,最大的區(qū)別就是增加了持久連線支援(貌似最新的http1.0 可以顯示的指定keep-alive),但還是無(wú)狀態(tài)的,或者說(shuō)是不可以信任的。?
??
何時(shí)用長(zhǎng)連接,短連接??
?長(zhǎng)連接多用於操作頻繁,點(diǎn)對(duì)點(diǎn)的通訊,而且連接數(shù)不能太多情況,。每個(gè)TCP連接都需要三步握手,這需要時(shí)間,如果每個(gè)操作都是先連接,再操作的話那麼處理速度會(huì)降低很多,所以每個(gè)操作完後都不斷開(kāi),次處理時(shí)直接發(fā)送數(shù)據(jù)包就OK了,不用建立TCP連線。例如:資料庫(kù)的連接用長(zhǎng)連接, 如果用短連接頻繁的通訊會(huì)造成socket錯(cuò)誤,而且頻繁的socket 創(chuàng)建也是對(duì)資源的浪費(fèi)。
??
而像WEB網(wǎng)站的http服務(wù)一般都用短鏈接,因?yàn)殚L(zhǎng)連接對(duì)於服務(wù)端來(lái)說(shuō)會(huì)耗費(fèi)一定的資源,而像WEB網(wǎng)站這麼頻繁的成千上萬(wàn)甚至上億客戶端的連接用短連接會(huì)更省一些資源,如果用長(zhǎng)連接,而且同時(shí)有成千上萬(wàn)的用戶,如果每個(gè)用戶都佔(zhàn)用一個(gè)連接的話,那可想而知吧。所以並發(fā)量大,但每個(gè)使用者無(wú)需頻繁操作情況下需用短連好。?
workerman是啥子? Workerman是純PHP開(kāi)發(fā)的開(kāi)源高效能的PHP socket 伺服器框架。廣泛的用於手機(jī)app、行動(dòng)通訊,微信小程序,手遊服務(wù)端、網(wǎng)路遊戲、PHP聊天室、硬體通訊、智慧家庭、車(chē)聯(lián)網(wǎng)、物聯(lián)網(wǎng)等領(lǐng)域的開(kāi)發(fā)。支援TCP長(zhǎng)連接,支援Websocket、HTTP等協(xié)議,支援自訂協(xié)議。擁有非同步Mysql、非同步Redis、非同步Http、非同步訊息佇列等眾多高效能元件。
開(kāi)始步入正題:為了達(dá)到即時(shí)通訊,很多時(shí)候我們採(cǎi)用了ajax輪詢機(jī)制,如圖:
後面可以採(cǎi)用workerman方式來(lái)實(shí)現(xiàn),專案也是tp寫(xiě)的,官方手冊(cè)這麼說(shuō)到
與其它mvc框架結(jié)合建議以上圖的方式(ThinkPHP為例):
1、ThinkPHP與Workerman是兩個(gè)獨(dú)立的系統(tǒng),獨(dú)立部署(可部署在不同伺服器),互不干擾。
2、ThinkPHP以HTTP協(xié)定提供網(wǎng)頁(yè)頁(yè)面在瀏覽器渲染展示。
3、ThinkPHP提供的頁(yè)面的js發(fā)起websocket連接,連接workerman
4、連接後給Workerman發(fā)送一個(gè)數(shù)據(jù)包(包含用戶名密碼或某種token串)用於驗(yàn)證websocket連線屬於哪個(gè)用戶。
5、只有ThinkPHP需要向?yàn)g覽器推送資料時(shí),才會(huì)呼叫workerman的socket介面推送資料。
6、其餘請(qǐng)求還是依照原本ThinkPHP的HTTP方式呼叫處理。
總結(jié):
把Workerman當(dāng)作可以向?yàn)g覽器推送的通道,僅在需要向?yàn)g覽器推送資料時(shí)才呼叫Workerman介面完成推送。業(yè)務(wù)邏輯全部在ThinkPHP中完成。
ok,到這裡,把workerman容器跑起來(lái),注意這裡是CLI模式運(yùn)行
#然後再我們專案接收訊息中這樣玩,附上程式碼
<script> // 連接服務(wù)端 var socket = io('http://127.0.0.1:2120'); // uid可以是自己網(wǎng)站的用戶id,以便針對(duì)uid推送 uid = 123; // socket連接后以u(píng)id登錄 socket.on('connect', function(){ socket.emit('login', uid); }); // 后端推送來(lái)消息時(shí) socket.on('new_msg', function(msg){ console.log("收到消息:"+msg); //自己業(yè)務(wù)邏輯處理 }); </script>
接著,我們?cè)谑褂谜邆魉陀嵪⒔o使用者的時(shí)候加上
// 指明給誰(shuí)推送,為空表示向所有在線用戶推送 $to_uid = "123"; // 推送的url地址 $push_api_url = "http://127.0.0.1:2121/"; $post_data = array( "type" => "publish", "content" => "數(shù)據(jù)", "to" => $to_uid, ); $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $push_api_url ); curl_setopt ( $ch, CURLOPT_POST, 1 ); curl_setopt ( $ch, CURLOPT_HEADER, 0 ); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $post_data ); curl_setopt ($ch, CURLOPT_HTTPHEADER, array("Expect:")); $return = curl_exec ( $ch ); curl_close ( $ch ); var_export($return);
其中,workerman裡面的推送核心程式碼實(shí)作
// 全局?jǐn)?shù)組保存uid在線數(shù)據(jù) $uidConnectionMap = array(); // 記錄最后一次廣播的在線用戶數(shù) $last_online_count = 0; // PHPSocketIO服務(wù) $sender_io = new SocketIO(2120); // 客戶端發(fā)起連接事件時(shí),設(shè)置連接socket的各種事件回調(diào) // 當(dāng)$sender_io啟動(dòng)后監(jiān)聽(tīng)一個(gè)http端口,通過(guò)這個(gè)端口可以給任意uid或者所有uid推送數(shù)據(jù) $sender_io->on('workerStart', function(){ // 監(jiān)聽(tīng)一個(gè)http端口 $inner_http_worker = new Worker('http://0.0.0.0:2121'); // 當(dāng)http客戶端發(fā)來(lái)數(shù)據(jù)時(shí)觸發(fā) $inner_http_worker->onMessage = function($http_connection, $data){ global $uidConnectionMap; $_POST = $_POST ? $_POST : $_GET; // 推送數(shù)據(jù)的url格式 type=publish&to=uid&content=xxxx switch(@$_POST['type']){ case 'publish': global $sender_io; $to = @$_POST['to']; $_POST['content'] = htmlspecialchars(@$_POST['content']); // 有指定uid則向uid所在socket組發(fā)送數(shù)據(jù) if($to){ $sender_io->to($to)->emit('new_msg', $_POST['content']); // 否則向所有uid推送數(shù)據(jù) }else{ $sender_io->emit('new_msg', @$_POST['content']); } // http接口返回,如果用戶離線socket返回fail if($to && !isset($uidConnectionMap[$to])){ return $http_connection->send('offline'); }else{ return $http_connection->send('ok'); } } return $http_connection->send('fail'); }; }); if(!defined('GLOBAL_START')) { Worker::runAll(); }
ok,大功告成!
以上是基於workerman的即時(shí)推播(摒棄ajax輪詢)的詳細(xì)內(nèi)容。更多資訊請(qǐng)關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費(fèi)脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門(mén)文章

熱工具

記事本++7.3.1
好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強(qiáng)大的PHP整合開(kāi)發(fā)環(huán)境

Dreamweaver CS6
視覺(jué)化網(wǎng)頁(yè)開(kāi)發(fā)工具

SublimeText3 Mac版
神級(jí)程式碼編輯軟體(SublimeText3)

實(shí)現(xiàn)Workerman文件中的文件上傳與下載,需要具體程式碼範(fàn)例引言:Workerman是一款高效能的PHP非同步網(wǎng)路通訊框架,具備簡(jiǎn)潔、高效、易用等特點(diǎn)。在實(shí)際開(kāi)發(fā)中,文件上傳和下載是常見(jiàn)的功能需求,本文將介紹如何使用Workerman框架實(shí)現(xiàn)文件的上傳和下載,並給出具體的程式碼範(fàn)例。一、檔案上傳:檔案上傳是指將本機(jī)上的檔案?jìng)鬏斨了欧鞫说牟僮?。下面是使?/p>

Swoole 和 Workerman 都是高效能 PHP 伺服器框架。 Swoole 以其非同步處理、出色的效能和可擴(kuò)展性而聞名,適用於需要處理大量並發(fā)請(qǐng)求和高吞吐量的專案。 Workerman 提供了非同步和同步模式的靈活性,具有直覺(jué)的 API,更適合易用性和處理較低並發(fā)量的專案。

如何實(shí)現(xiàn)Workerman文件的基本使用方法簡(jiǎn)介:Workerman是一個(gè)高效能的PHP開(kāi)發(fā)框架,它可以幫助開(kāi)發(fā)者輕鬆建立高並發(fā)的網(wǎng)路應(yīng)用程式。本文將介紹Workerman的基本使用方法,包括安裝和設(shè)定、建立服務(wù)和監(jiān)聽(tīng)連接埠、處理客戶端請(qǐng)求等。並給出相應(yīng)的程式碼範(fàn)例。一、安裝並設(shè)定Workerman在命令列中輸入以下命令來(lái)安裝Workerman:c

如何實(shí)現(xiàn)Workerman文件中的定時(shí)器功能Workerman是一款強(qiáng)大的PHP非同步網(wǎng)路通訊框架,它提供了豐富的功能,其中就包括定時(shí)器功能。使用定時(shí)器可以在指定的時(shí)間間隔內(nèi)執(zhí)行程式碼,非常適合定時(shí)任務(wù)、輪詢等應(yīng)用程式場(chǎng)景。接下來(lái),我將詳細(xì)介紹如何在Workerman中實(shí)現(xiàn)定時(shí)器功能,並提供具體的程式碼範(fàn)例。第一步:安裝Workerman首先,我們需要安裝Worker

如何實(shí)現(xiàn)Workerman文件中的反向代理功能,需要具體程式碼範(fàn)例簡(jiǎn)介:Workerman是一款高效能的PHP多進(jìn)程網(wǎng)路通訊框架,提供了豐富的功能和強(qiáng)大的效能,廣泛應(yīng)用於Web即時(shí)通訊、長(zhǎng)連接服務(wù)等場(chǎng)景。其中,Workerman也支援反向代理功能,可實(shí)現(xiàn)伺服器對(duì)外提供服務(wù)時(shí)的負(fù)載平衡和靜態(tài)資源快取等功能。本篇文章將介紹如何使用Workerman實(shí)現(xiàn)反向代理功

Workerman開(kāi)發(fā):基於UDP協(xié)議的即時(shí)視訊通話摘要:本文將介紹如何使用Workerman框架實(shí)現(xiàn)基於UDP協(xié)議的即時(shí)視訊通話功能。我們將深入了解UDP協(xié)議的特點(diǎn),並透過(guò)程式碼範(fàn)例展示如何建立一個(gè)簡(jiǎn)單但完整的即時(shí)視訊通話應(yīng)用程式。引言:在網(wǎng)路通訊中,即時(shí)視訊通話是一項(xiàng)非常重要的功能。傳統(tǒng)的TCP協(xié)定在實(shí)現(xiàn)即時(shí)性較高的視訊通話時(shí),可能會(huì)有傳輸延遲等問(wèn)題。而UDP

如何使用Workerman建立高可用性負(fù)載平衡系統(tǒng),需要具體程式碼範(fàn)例在現(xiàn)代技術(shù)領(lǐng)域中,隨著網(wǎng)路的快速發(fā)展,越來(lái)越多的網(wǎng)站和應(yīng)用程式需要處理大量的並發(fā)請(qǐng)求。為了實(shí)現(xiàn)高可用性和高效能,負(fù)載平衡系統(tǒng)成為了必不可少的組件之一。本文將介紹如何使用PHP開(kāi)源框架Workerman建構(gòu)一個(gè)高可用性的負(fù)載平衡系統(tǒng),並提供具體的程式碼範(fàn)例。一、Workerman簡(jiǎn)介Worke

Workerman是基於PHP開(kāi)發(fā)的高效能非同步事件驅(qū)動(dòng)框架,它可以輕鬆實(shí)現(xiàn)TCP/UDP協(xié)定下的長(zhǎng)連線開(kāi)發(fā)。除此之外,Workerman也提供了實(shí)現(xiàn)檔案?jìng)鬏數(shù)墓δ埽梢杂渺洞髾n案?jìng)鬏?、資料備份等場(chǎng)景。本文將介紹如何在Workerman中實(shí)現(xiàn)檔案?jìng)鬏敼δ?,並提供具體的程式碼範(fàn)例。一、文件上傳功能實(shí)現(xiàn)文件上傳功能需要客戶端將要上傳的文件傳送給服務(wù)端,服務(wù)端驗(yàn)證
