首頁 php框架 ThinkPHP 使用 Workman 做一個聊天室

使用 Workman 做一個聊天室

Jun 21, 2019 pm 02:52 PM
tp 聊天室

使用 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
4 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

熱門話題

Java教學
1672
14
CakePHP 教程
1428
52
Laravel 教程
1332
25
PHP教程
1276
29
C# 教程
1256
24
如何使用MySQL和Java實作一個簡單的聊天室功能 如何使用MySQL和Java實作一個簡單的聊天室功能 Sep 21, 2023 pm 05:13 PM

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

如何使用Go語言開發Websocket聊天室 如何使用Go語言開發Websocket聊天室 Dec 14, 2023 pm 01:46 PM

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

基於JavaScript建立即時聊天室 基於JavaScript建立即時聊天室 Aug 10, 2023 pm 11:18 PM

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

ThinkPHP6聊天室開髮指南:實現即時通訊功能 ThinkPHP6聊天室開髮指南:實現即時通訊功能 Aug 12, 2023 pm 02:31 PM

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

TP6 Think-Swoole RPC服務的效能最佳化與除錯 TP6 Think-Swoole RPC服務的效能最佳化與除錯 Oct 12, 2023 am 11:16 AM

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

利用php和Websocket開發聊天室功能 利用php和Websocket開發聊天室功能 Dec 02, 2023 am 11:08 AM

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

Swoole實戰:快速打造基於WebSocket的聊天室 Swoole實戰:快速打造基於WebSocket的聊天室 Jun 14, 2023 pm 04:20 PM

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

TP6 Think-Swoole RPC服務的高可擴展性與分散部署 TP6 Think-Swoole RPC服務的高可擴展性與分散部署 Oct 12, 2023 am 11:07 AM

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

See all articles