ホームページ > PHPフレームワーク > Workerman > 労働者育成の実践: 効率的なインスタント メッセージング システムの構築

労働者育成の実践: 効率的なインスタント メッセージング システムの構築

PHPz
リリース: 2023-08-05 14:03:15
オリジナル
1164 人が閲覧しました

労働者育成の実践: 効率的なインスタント メッセージング システムの構築

はじめに:
インターネットの急速な発展と、リアルタイム通信に対するユーザーの需要の増大に伴い、インスタント メッセージング システムは一般的な開発となっています。分野。さまざまなリアルタイム通信のニーズを満たすために、PHP オープンソース フレームワーク Workerman を使用して、効率的で安定したインスタント メッセージング システムを構築できます。この記事では、Workerman フレームワークを使用して強力なインスタント メッセージング システムを開発する方法を紹介し、コード例を添付します。

  1. Workerman のインストール:
    まず、Workerman フレームワークをインストールする必要があります。ターミナルで次のコマンドを実行して Workerman をインストールします:

    composer require workerman/workerman
    ログイン後にコピー

    インストールが完了したら、インスタント メッセージング システムの構築を開始できます。

  2. サーバーの作成:
    server.php という名前の新しい PHP ファイルを作成して、インスタント メッセージング システムのサーバーを構築します。 server.php ファイルには、次のコードを記述する必要があります。
<?php
require_once __DIR__.'/vendor/autoload.php';

use WorkermanWorker;

// 创建一个Worker监听2345端口,使用websocket协议通信
$ws_worker = new Worker("websocket://0.0.0.0:2345");

// 设置进程数
$ws_worker->count = 4;

// 当客户端连接时
$ws_worker->onConnect = function($connection){
    echo "New connection
";
};

// 当客户端发送消息时
$ws_worker->onMessage = function($connection, $data){
    foreach($connection->worker->connections as $clientConnection){
        $clientConnection->send($data);
    }
};

// 当客户端断开连接时
$ws_worker->onClose = function($connection){
    echo "Connection closed
";
};

// 运行worker
Worker::runAll();
ログイン後にコピー

上記のコードは、Worker オブジェクトを作成し、ポート 2345 をリッスンし、WebSocket プロトコルを使用して通信します。クライアントが接続されている場合は「新しい接続」が出力され、クライアントがメッセージを送信すると、接続されているすべてのクライアントにメッセージが送信され、クライアントが切断された場合は「接続が閉じられました」が出力されます。最後に、Worker::runAll() メソッドを使用してワーカーを実行します。

  1. クライアントの作成:
    client.php という名前の新しい PHP ファイルを作成します。このファイルは、インスタント メッセージング システムのクライアントの構築に使用されます。 client.php ファイルに、次のコードを記述する必要があります。
<?php
require_once __DIR__.'/vendor/autoload.php';

use WorkermanWorker;
use WorkermanAutoloader;
use WorkermanConnectionAsyncTcpConnection;

$connect_list = array();

// 当用户输入消息时
function onMessage($connect)
{
    // 从终端读取用户输入的消息
    $message = trim(fgets(STDIN));
    
    // 发送消息到服务端
    $connect->send($message);
}

// 创建一个异步TCP连接到服务端
$connect = new AsyncTcpConnection('ws://127.0.0.1:2345');
$connect->onConnect = function($connection){
    echo "Connected to server
";
};
$connect->onMessage = function($connection, $data){
    echo "Received message: ".$data."
";
};
$connect->onClose = function($connection){
    echo "Disconnected from server
";
};

// 运行连接
$connect->connect();

// 将连接对象保存到连接列表中
$connect_list[] = $connect;

// 监听用户输入消息
Worker::addWorker(function(){
    readline_callback_handler_install('', function(){});
    while (true) {
        if (count($GLOBALS['connect_list']) > 0) {
            $read = array_values($GLOBALS['connect_list']);
            $write = null;
            $except = null;
            if (false === ($num_changed_streams = stream_select($read, $write, $except, 1))) {
                continue;
            } elseif ($num_changed_streams > 0) {
                foreach($read as $connect) {
                    onMessage($connect);
                }
            }
        }
    }
});
Worker::runAll();
ログイン後にコピー

上記のコードは、AsyncTcpConnection オブジェクトを作成し、サーバーの 2345 ポートに接続します。接続に成功した場合は「サーバーに接続しました」、サーバーから送信されたメッセージを受信した場合は「受信メッセージ: 」と具体的なメッセージ内容が出力され、サーバーとの接続が切断された場合は「サーバーから切断されました」と表示されます。 」と出力されます。同時に、ユーザーが入力したメッセージが監視され、接続オブジェクトを通じてサーバーに送信されます。

  1. インスタント メッセージング システムを実行します:
    ターミナルで次のコマンドを実行してサーバーとクライアントを起動します:

    php server.php
    php client.php
    ログイン後にコピー

    サーバーとクライアントが実行されます。つまり、リスニング状態になり、相互にメッセージを送信できるようになります。サーバーは、クライアントから送信されたメッセージを受信すると、接続されているすべてのクライアントにメッセージをブロードキャストします。

概要:
この記事では、Workerman を使用して効率的なインスタント メッセージング システムを開発する方法を紹介しました。サーバーとクライアントを構築し、対応するコードを記述することで、リアルタイム通信機能を実現できます。 Workerman は API と関数の完全なセットを提供しており、強力なインスタント メッセージング システムを簡単に構築できます。この記事があなたのお役に立てれば幸いです、読んでいただきありがとうございます!

以上が労働者育成の実践: 効率的なインスタント メッセージング システムの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート