使用 Workman 做一個聊天室
為什麼要寫這篇文章?
我學習Workman好幾次了,每次都失敗(沒做成想要的功能,原諒我比較笨)。但這次也花了好幾個小時,把之前沒做成的功能實現了。其實就是兩個簡單的功能:一對一發送訊息,廣播訊息(群組聊天)。這個功能用swoole早都實現了,也是由於之前一直想用 think-worker 的原因,想想還是得自己琢磨才行,人家做好的框架或許是個閹割版。
別問我為什麼不用swoole,因為 workman 可以在Windows中運作。
(1)首先,得簡單說說 thinkphp workerman 的安裝。
安裝thinkphp5.1
composer create-project topthink/think=5.1.x-dev tp5andworkman
安裝think-worker
composer require topthink/think-worker=2.0.*
直接安裝workman
composer require workerman/workerman
(2)我們先來看think-worker 的程式碼
config/worker_server.php
先來個伺服器廣播訊息的範例,每10秒鐘定時廣播一則訊息
'onWorkerStart' => function ($worker) { \Workerman\Lib\Timer::add(10, function()use($worker){ // 遍历当前进程所有的客户端连接,发送自定义消息 foreach($worker->connections as $connection){ $send['name'] = '系统信息'; $send['content'] = '这是一个定时任务信息'; $send['time'] = time(); $connection->send(json_encode($send)); } }); }
但是在onMessage 時,我們取得不到$worker 對象,所以無法廣播訊息。
'onMessage' => function ($connection, $data) { $origin = json_decode($data,true); $send['name'] = '广播数据'; $send['content'] = $origin['content']; $message = json_encode($send); foreach($worker->connections as $connection) { $connection->send($message); } }
嘗試了各種方法,似乎都不行
'onMessage' => function ($connection, $data)use($worker) { // 这样是获取不到 $worker 对象的 // ...省略代码 }
所以只能拋棄thinkphp 給我們封裝的think-worker 框架,得自己寫,(或修改框架內部程式碼)
修改框架內部的程式碼:/vendor/topthink/think-worker/src/command/Server.php
,主要是把onMessage 方法自己加進去
use()就是把外部變數傳遞到函數內部使用,或是使用global $worker
$worker = new Worker($socket, $context); $worker->onMessage = function ($connection, $data)use($worker) { $origin = json_decode($data,true); $send['name'] = '广播数据'; $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
其實你早都已經看出,$worker->connections 獲取到的是當前所有用戶的連接,connections 即為其中一個鏈接。
記錄websocket連線時間:
$worker->onConnect = function ($connection) { $connection->login_time = time(); };
取得websocket連線時間:
$worker->onMessage = function ($connection, $data)use($worker) { $login_time = $connection->login_time; };
由此可以看出,我們可以把資料綁定到$connection 連線的一個屬性,例如:
$connection->uid = $uid;
當JavaScript端在連接websocket伺服器成功後,也就是把自己的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']; // 需要发送的对方的uid $content = $origin['content']; // 需要发送到对方的内容 foreach($worker->connections as $connection) { if( $connection->uid == $sendTo){ $connection->send($content); } } };
到此,已經完成基於workman 的自訂物件發送訊息。
由於該php檔案存放在composer中,只需要把該檔案複製出來,放到application/command
,修改命名空間,即可儲存到自己的專案中
(5)比較swoole
1、workman可以在windows系統中執行,swoole則不能。
2、workman:$worker->connections取得所有連接,$connection->id取得自己的連接id;swoole:$server->connections取得所有連接,$connection->fd取得自己的連接id。
3、workman啟動時執行 onWorkerStart 方法,可以把定時器寫入到裡面;swoole 使用 WorkerStart 啟動計時器。
僅僅於聊天室或計時器而言,workman 還是比較方便的。
更多ThinkPHP相關技術文章,請造訪ThinkPHP使用教學欄位進行學習!
以上是使用 Workman 做一個聊天室的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

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

如何使用MySQL和Java實作一個簡單的聊天室功能引言:在當今社群媒體的盛行下,人們越來越依賴線上聊天來交流和分享資訊。如何使用MySQL和Java實作一個簡單的聊天室功能是一個非常有趣且實用的專案。本文將介紹如何使用MySQL和Java來實現此功能,並提供具體的程式碼範例。一、搭建資料庫首先,我們需要在MySQL中建立一個資料庫來儲存聊天室的相關資訊。

如何使用Go語言開發Websocket聊天室Websocket是一種即時通訊協議,透過建立一次連接,可以在伺服器和客戶端之間進行雙向通訊。在開發聊天室時,Websocket是一個非常好的選擇,因為它可以實現即時訊息交流,並且能夠提供高效的效能。本文將介紹如何使用Go語言開發一個簡單的Websocket聊天室,並提供一些具體的程式碼範例。一、準備工作1.安裝Go

基於JavaScript建立即時聊天室隨著網路的快速發展,人們越來越注重即時通訊和即時互動體驗。而即時聊天室作為一種常見的即時通訊工具,對於個人和企業來說都非常重要。本文將介紹如何使用JavaScript建立一個簡單的即時聊天室,並提供對應的程式碼範例。我們首先需要一個前端頁面作為聊天室的UI介面。以下是一個簡單的HTML結構範例:<!DOCTYPE

ThinkPHP6聊天室開髮指南:實現即時通訊功能引言:隨著網路的快速發展,即時通訊的需求也越來越大。聊天室作為一種常見的即時通訊方式,受到了廣泛的關注和使用。本文將透過使用ThinkPHP6框架,為大家提供一個簡單、快速實現即時通訊功能的方法。一、環境配置:在開始之前,我們需要先配置開發環境。確保你已經安裝了PHP和ThinkPHP6框架。同時,本文將使

TP6Think-SwooleRPC服務的效能最佳化與調試一、引言隨著網際網路的快速發展,分散式運算已成為了現代軟體開發中不可或缺的一部分。在分散式運算中,RPC(RemoteProcedureCall,遠端過程呼叫)是一種常用的通訊機制,透過它可以實現跨網路的方法呼叫。 Think-Swoole作為一個高效能的PHP框架,可以很好地支援RPC服務。但是

利用PHP和Websocket開發聊天室功能引言:隨著網路的快速發展,聊天室成為人們日常交流和社交的重要手段之一。利用PHP和Websocket技術開發一個聊天室功能可以實現即時的雙向通信,為用戶提供更流暢便捷的聊天體驗。本文將介紹如何使用PHP和Websocket來實作一個簡單的聊天室,並提供具體的程式碼範例。一、準備工作:在開始開發之前,我們需要確保

在網路時代,聊天室成為了人們交流、社交的重要場所。而WebSocket技術的出現,則使得即時通訊變得更流暢、更穩定。今天,我們介紹如何利用Swoole框架快速建立一個基於WebSocket的聊天室。 Swoole是一款高效能的PHP協程網路通訊框架,採用C語言編寫,集非同步IO、協程、網路通訊等功能於一身,使得PHP程式碼能夠像Node.js

TP6(ThinkPHP6)是一款基於PHP的開源框架,具有高可擴展性與分散式部署的特性。本文將介紹如何使用TP6配合Swoole擴展,建構一個具備高可擴展性的RPC服務,並給予具體的程式碼範例。首先,我們需要安裝TP6和Swoole擴充。在命令列中執行以下命令:composerrequiretopthink/thinkpeclinstallswo
