ホームページ PHPフレームワーク ThinkPHP Workman を使用してチャット ルームを作成する

Workman を使用してチャット ルームを作成する

Jun 21, 2019 pm 02:52 PM
tp チャットルーム

Workman を使用してチャット ルームを作成する

なぜこの記事を書くのか?

私はワークマンを何度か学習しましたが、毎回失敗しました(目的の機能を達成できませんでした。愚かであることを許してください)。しかし今回は、これまでに実装されていない機能の実装にも数時間かかりました。実際には、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 サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQLとJavaを使った簡単なチャットルーム機能の実装方法 MySQLとJavaを使った簡単なチャットルーム機能の実装方法 Sep 21, 2023 pm 05:13 PM

MySQL と Java を使用して簡単なチャット ルーム機能を実装する方法 はじめに: 今日のソーシャル メディアの普及に伴い、人々はコミュニケーションや情報共有のためにオンライン チャットにますます依存しています。 MySQL と Java を使用して簡単なチャット ルーム機能を実装する方法は、非常に興味深く実践的なプロジェクトです。この記事では、MySQL と Java を使用してこの機能を実装する方法と、具体的なコード例を紹介します。 1. データベースを構築する まず、チャット ルーム関連の情報を保存するデータベースを MySQL に作成する必要があります。

JavaScript に基づいてリアルタイム チャット ルームを構築する JavaScript に基づいてリアルタイム チャット ルームを構築する Aug 10, 2023 pm 11:18 PM

JavaScript に基づいてリアルタイム チャット ルームを構築する インターネットの急速な発展に伴い、人々はインスタント メッセージングとリアルタイムのインタラクティブ エクスペリエンスにますます注目を集めています。一般的なインスタント メッセージング ツールとして、リアルタイム チャット ルームは個人と企業の両方にとって非常に重要です。この記事では、JavaScript を使用して簡単なリアルタイム チャット ルームを構築する方法と、対応するコード例を紹介します。まず、チャット ルームの UI インターフェイスとしてフロントエンド ページが必要です。単純な HTML 構造の例を次に示します: <!DOCTYPE

Go言語を使用してWebSocketチャットルームを開発する方法 Go言語を使用してWebSocketチャットルームを開発する方法 Dec 14, 2023 pm 01:46 PM

Go 言語を使用して Websocket チャット ルームを開発する方法. Websocket は、接続を確立することでサーバーとクライアント間の双方向通信を可能にするリアルタイム通信プロトコルです。 Websocket は、リアルタイムのメッセージ交換を可能にし、効率的なパフォーマンスを提供するため、チャット ルームを開発する場合に非常に良い選択肢です。この記事では、Go 言語を使用して簡単な Websocket チャット ルームを開発する方法と、いくつかの具体的なコード例を紹介します。 1. 準備 1. Goをインストールする

TP6 Think-Swoole RPC サービスのパフォーマンスの最適化とデバッグ TP6 Think-Swoole RPC サービスのパフォーマンスの最適化とデバッグ Oct 12, 2023 am 11:16 AM

TP6Think-SwooleRPC サービスのパフォーマンスの最適化とデバッグ 1. はじめに インターネットの急速な発展に伴い、分散コンピューティングは現代のソフトウェア開発に不可欠な部分となっています。分散コンピューティングでは、RPC (RemoteProcedureCall、リモート プロシージャ コール) は、ネットワーク全体でメソッド呼び出しを実装できる一般的に使用される通信メカニズムです。 Think-Swoole は、高性能 PHP フレームワークとして、RPC サービスを適切にサポートできます。しかし

ThinkPHP6 チャット ルーム開発ガイド: リアルタイム通信機能の実装 ThinkPHP6 チャット ルーム開発ガイド: リアルタイム通信機能の実装 Aug 12, 2023 pm 02:31 PM

ThinkPHP6 チャット ルーム開発ガイド: リアルタイム コミュニケーション機能の実装 はじめに: インターネットの急速な発展に伴い、リアルタイム コミュニケーションの需要も高まっています。リアルタイム コミュニケーションの一般的な方法として、チャット ルームは広く注目され、使用されています。この記事では、ThinkPHP6 フレームワークを使用してリアルタイム通信機能を実装する簡単かつ迅速な方法を説明します。 1. 環境構成: 開始する前に、開発環境を構成する必要があります。 PHP および ThinkPHP6 フレームワークがインストールされていることを確認してください。同時に、この記事では、

phpとWebsocketを使ったチャットルーム機能の開発 phpとWebsocketを使ったチャットルーム機能の開発 Dec 02, 2023 am 11:08 AM

PHP と Websocket を使用してチャット ルーム機能を開発する はじめに: インターネットの急速な発展に伴い、チャット ルームは人々が日常生活でコミュニケーションし、交流するための重要な手段の 1 つになりました。 PHP と Websocket テクノロジーを使用してチャット ルーム機能を開発すると、リアルタイムの双方向コミュニケーションが実現され、よりスムーズで便利なチャット エクスペリエンスをユーザーに提供できます。この記事では、PHP と Websocket を使用して簡単なチャット ルームを実装する方法と、具体的なコード例を紹介します。 1. 準備: 開発を開始する前に、次のことを確認する必要があります。

Swoole の動作: WebSocket に基づいてチャット ルームをすばやく作成します Swoole の動作: WebSocket に基づいてチャット ルームをすばやく作成します Jun 14, 2023 pm 04:20 PM

インターネット時代において、チャット ルームは人々がコミュニケーションし、社交するための重要な場所となっています。 WebSocket テクノロジーの登場により、リアルタイム通信がよりスムーズかつ安定しました。今回は、Swoole フレームワークを使用して WebSocket ベースのチャット ルームをすばやく構築する方法を紹介します。 Swoole は、C 言語で書かれた高性能 PHP コルーチン ネットワーク通信フレームワークで、非同期 IO、コルーチン、ネットワーク通信、その他の機能を統合し、Node.js のような PHP コードを作成します。

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