安裝thinkphp5.1
composer create-project topthink/think=5.1.x-dev tp5andWorkerman
安裝think-worker
composer require topthink/think-worker=2.0.*
直接安裝Workerman
composer require workerman/workerman
(2)我們先看think-worker 的程式碼
config/worker_server.php
先來(lái)個(gè)伺服器廣播訊息的範(fàn)例,每10秒鐘定時(shí)廣播一則訊息
'onWorkerStart' => function ($worker) { \Workerman\Lib\Timer::add(10, function()use($worker){ // 遍歷當(dāng)前進(jìn)程所有的客戶端連接,發(fā)送自定義消息 foreach($worker->connections as $connection){ $send['name'] = '系統(tǒng)信息'; $send['content'] = '這是一個(gè)定時(shí)任務(wù)信息'; $send['time'] = time(); $connection->send(json_encode($send)); } });}
但是在onMessage 時(shí),我們?nèi)〉貌坏?worker 對(duì)象,所以無(wú)法廣播訊息。
'onMessage' => function ($connection, $data) { $origin = json_decode($data,true); $send['name'] = '廣播數(shù)據(jù)'; $send['content'] = $origin['content']; $message = json_encode($send); foreach($worker->connections as $connection) { $connection->send($message); }}
修改框架內(nèi)部的程式碼:/vendor/topthink/think-worker/src/command/Server.php,主要是把onMessage 方法自己加進(jìn)去
use() 就是把外部變數(shù)傳遞到函數(shù)內(nèi)部使用,或是使用global $worker
$worker = new Worker($socket, $context);$worker->onMessage = function ($connection, $data)use($worker) { $origin = json_decode($data,true); $send['name'] = '廣播數(shù)據(jù)'; $send['content'] = $origin['content']; $send['uid'] = $connection->uid; $message = json_encode($send); foreach($worker->connections as $connection) { $connection->send($message); }};
這樣,我們就能夠取得到$worker 物件了
$worker->onMessage = function ($connection, $data )use($worker) { ... }
(3)$connection 綁定uid
其實(shí)你早都已經(jīng)看出,$worker->connections 取得到的是目前所有使用者的連接,connections 即為其中一個(gè)連結(jié)。
記錄websocket連線時(shí)間:
$worker->onConnect = function ($connection) { $connection->login_time = time();};
取得websocket連線時(shí)間:
$worker->onMessage = function ($connection, $data)use($worker) { $login_time = $connection->login_time;};
由此可以看出,我們可以把資料綁定到$connection 連線的一個(gè)屬性,例如:
$connection->uid = $uid;
當(dāng)JavaScript端在連接websocket伺服器成功後,也就是把自己的uid 立刻發(fā)送服務(wù)端綁定:
var uid = 600;ws.onopen = function() { ws.send(JSON.stringify({bind:'yes',uid:uid}));};
$worker->onMessage = function ($connection, $data)use($worker) { $origin = json_decode($data,true); if(array_key_exists('bind',$origin)){ $connection->uid = $origin['uid']; }};
(4)單播傳送訊息,即自訂傳送
$worker->onMessage = function ($connection, $data)use($worker) { $origin = json_decode($data,true); $sendTo = $origin['sendto']; // 需要發(fā)送的對(duì)方的uid $content = $origin['content']; // 需要發(fā)送到對(duì)方的內(nèi)容 foreach($worker->connections as $connection) { if( $connection->uid == $sendTo){ $connection->send($content); } }};
到此,已經(jīng)完成基於Workerman 的自訂物件傳送訊息。
由於這個(gè)php檔案存放在composer中,只需要把該檔案複製出來(lái),放到application/command,修改命名空間,即可儲(chǔ)存到自己的專案中
(5)儲(chǔ)存聊天記錄
使用Redis 做快取對(duì)伺服器影響較小,且基本上不影響回應(yīng)時(shí)間
1、把聊天記錄儲(chǔ)存到Redis 中,使用清單儲(chǔ)存
$message = json_decode($data,true); // $data為接收到的數(shù)據(jù) $redis_instance = Cache::handler(); // TP5代碼獲取Cache實(shí)例 $redis_instance->lPush('message',json_encode($message,JSON_UNESCAPED_UNICODE));
2、某些情況下,當(dāng)使用者第一次(或刷新)聊天頁(yè)面時(shí),顯示最近10筆記錄
$redis_instance = Cache::handler(); // TP5代碼獲取Cache實(shí)例 $worker->onConnect = function ($connection)use($redis_instance) { $length = $redis_instance->lLen('message'); if($length > 0){ $send['recently'] = array_reverse($redis_instance->lRange('message', 0, 10)); $send['state'] = 200; $message = json_encode($send,JSON_UNESCAPED_UNICODE); $connection->send($message); }else{ $send['state'] = 204; $send['recently'] = []; $send['msg'] = '暫無(wú)聊天記錄'; $message = json_encode($send,JSON_UNESCAPED_UNICODE); $connection->send($message); } };
javascript取得到recently 最近聊天記錄時(shí)處理:
ws.onmessage = function(e) { var your = JSON.parse(e.data); if(your.recently){ // 初次打開頁(yè)面,渲染最近10條聊天記錄 $.each(your.recently,function(index,item){ item = JSON.parse(item); // TODO:遍歷渲染頁(yè)面 }); }else{ // 處理其他消息 msglist.append('<li>'+your.content+'</li>'); } };#
以上是workerman如何實(shí)現(xiàn)聊天系統(tǒng)的詳細(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)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

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

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

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

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

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

實(shí)現(xiàn)Workerman文件中的文件上傳與下載,需要具體程式碼範(fàn)例引言:Workerman是一款高效能的PHP非同步網(wǎng)路通訊框架,具備簡(jiǎn)潔、高效、易用等特點(diǎn)。在實(shí)際開發(fā)中,文件上傳和下載是常見的功能需求,本文將介紹如何使用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開發(fā)框架,它可以幫助開發(fā)者輕鬆建立高並發(fā)的網(wǎng)路應(yīng)用程式。本文將介紹Workerman的基本使用方法,包括安裝和設(shè)定、建立服務(wù)和監(jiān)聽連接埠、處理客戶端請(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

Workerman開發(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

如何實(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建立高可用性負(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開源框架Workerman建構(gòu)一個(gè)高可用性的負(fù)載平衡系統(tǒng),並提供具體的程式碼範(fàn)例。一、Workerman簡(jiǎn)介Worke

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