なぜこの記事を書くのか?
私はワークマンを何度か学習しましたが、毎回失敗しました(目的の機能を達成できませんでした。愚かであることを許してください)。しかし今回は、これまでに実装されていない機能の実装にも数時間かかりました。実際には、1 対 1 でメッセージを送信する機能と、メッセージをブロードキャストする (グループ チャット) という 2 つの単純な機能があります。この機能は昔から swoole で実装していましたが、私が think-worker を使いたいと思っていたからでもあります。考えてみれば、やはり自分で考えなければなりません。他の人が作ったフレームワークは去勢されているのかもしれません。バージョン。
workman は Windows で実行できるため、なぜ swoole を使用しないのかは聞かないでください。
(1) まず、thinkphp workman のインストールについて簡単に説明します。
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) 見てみましょうit first think-worker code
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 を取得できます。 object
$worker->onMessage = function ($connection, $data)use($worker) { ... }
( 3) $connection は uid
にバインドされています。実際、$worker->connections が現在のすべてのユーザーの接続を取得することはすでにわかりました。 、接続もリンクの 1 つです。
Web ソケット接続時間を記録する:
$worker->onConnect = function ($connection) { $connection->login_time = time(); };
Web ソケット接続時間を取得する:
$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 ファイルはコンポーザーに保存されているため、ファイルをコピーして application/command
に配置し、名前空間を変更して独自のプロジェクトに保存するだけです
(5) swoole との比較
1. Workman は Windows システムで実行できますが、swoole は実行できません。
2. workman: $worker->connections はすべての接続を取得し、$connection->id は独自の接続 ID を取得します; swoole: $server->connections はすべての接続を取得します、$connection->fd独自の接続 ID を取得します。
3. onWorkerStart メソッドは workman の開始時に実行され、タイマーを書き込むことができます。swoole は WorkerStart を使用してタイマーを開始します。
チャットルームやタイマーならやはりワークマンの方が便利です。
ThinkPHP 関連の技術記事の詳細については、ThinkPHP の使用法チュートリアル 列にアクセスして学習してください。
以上がWorkman を使用してチャット ルームを作成するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

如何使用MySQL和Java实现一个简单的聊天室功能引言:在当今社交媒体的盛行下,人们越来越依赖于在线聊天来交流和分享信息。如何使用MySQL和Java实现一个简单的聊天室功能是一个非常有趣和实用的项目。本文将介绍如何使用MySQL和Java来实现这一功能,并提供具体的代码示例。一、搭建数据库首先,我们需要在MySQL中创建一个数据库来存储聊天室的相关信息。

如何使用Go语言开发Websocket聊天室Websocket是一种实时通信协议,通过建立一次连接,可以在服务器和客户端之间进行双向通信。在开发聊天室时,Websocket是一个非常好的选择,因为它可以实现实时消息交流,并且能够提供高效的性能。本文将介绍如何使用Go语言开发一个简单的Websocket聊天室,并提供一些具体的代码示例。一、准备工作1.安装Go

基于JavaScript构建实时聊天室随着互联网的快速发展,人们越来越注重即时通讯和实时互动体验。而实时聊天室作为一种常见的即时通讯工具,对于个人和企业来说都非常重要。本文将介绍如何使用JavaScript构建一个简单的实时聊天室,并提供相应的代码示例。我们首先需要一个前端页面作为聊天室的UI界面。以下是一个简单的HTML结构示例:<!DOCTYPE

TP6Think-SwooleRPC服务的性能优化与调试一、引言随着互联网的迅猛发展,分布式计算已经成为了现代软件开发中不可或缺的一部分。在分布式计算中,RPC(RemoteProcedureCall,远程过程调用)是一种常用的通信机制,通过它可以实现跨网络的方法调用。Think-Swoole作为一个高性能的PHP框架,可以很好地支持RPC服务。但是

ThinkPHP6聊天室开发指南:实现实时通讯功能引言:随着互联网的快速发展,实时通讯的需求也越来越大。聊天室作为一种常见的实时通讯方式,受到了广泛的关注和使用。本文将通过使用ThinkPHP6框架,为大家提供一种简单、快速实现实时通讯功能的方法。一、环境配置:在开始之前,我们需要配置好开发环境。确保你已经安装了PHP和ThinkPHP6框架。同时,本文将使

利用PHP和Websocket开发聊天室功能引言:随着互联网的迅猛发展,聊天室已经成为人们日常交流和社交的重要手段之一。利用PHP和Websocket技术开发一个聊天室功能可以实现实时的双向通信,为用户提供更流畅便捷的聊天体验。本文将介绍如何使用PHP和Websocket来实现一个简单的聊天室,并提供具体的代码示例。一、准备工作:在开始开发之前,我们需要确保

在互联网时代,聊天室成为了人们交流、社交的一个重要场所。而WebSocket技术的出现,则使得实时通信变得更为流畅、稳定。今天,我们介绍如何利用Swoole框架快速搭建一个基于WebSocket的聊天室。Swoole是一款高性能的PHP协程网络通信框架,采用C语言编写,集异步IO、协程、网络通信等功能于一身,使得PHP代码能够像Node.js

在Web开发领域中,实时聊天功能已经越来越普及。它可以帮助用户轻松地进行实时互动,增进交流和了解。为了实现实时聊天,我们需要使用WebSocket协议,并且需要一种可以处理WebSocket请求的编程语言。在本文中,我们将介绍如何使用PHP和WebSocket集成实现实时聊天室的开发。WebSocket是一种全双工的通信协议,可以在浏览器和服务器之间进行实时


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

SAP NetWeaver Server Adapter for Eclipse
Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

EditPlus 中国語クラック版
サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版
ビジュアル Web 開発ツール

メモ帳++7.3.1
使いやすく無料のコードエディター

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター
