ホームページ >PHPフレームワーク >Workerman >Workerman ドキュメントのサーバー クラスターの実装方法

Workerman ドキュメントのサーバー クラスターの実装方法

王林
王林オリジナル
2023-11-08 20:09:181012ブラウズ

Workerman ドキュメントのサーバー クラスターの実装方法

Workerman は、PHP が非同期ネットワーク通信をより効率的に処理できるようにする高性能 PHP ソケット フレームワークです。 Workerman のドキュメントには、サーバー クラスターの実装方法に関する詳細な手順とコード例が記載されています。

サーバー クラスターを実装するには、まずサーバー クラスターの概念を明確にする必要があります。サーバー クラスターは複数のサーバーをネットワークに接続し、負荷とリソースを共有することでシステムのパフォーマンス、信頼性、拡張性を向上させます。 Workerman では、サーバー クラスタリングは 2 つの方法で実装できます。1 つは中央ロード バランサを使用する方法、もう 1 つは分散共有メモリを使用する方法です。

  1. セントラル ロード バランサの使用 (ロード バランサ)
    セントラル ロード バランサは、分散システムの主要コンポーネントの 1 つです。クライアントからリクエストを受信し、クラスター内のさまざまなサーバーにリクエストを分散します。 Workerman では、中央のロード バランサとして機能する別の PHP スクリプトを作成することで、この機能を実現できます。

まず、Workerman をインストールする必要があります。 Composer を通じてインストールすることも、ソース コードを直接ダウンロードして Autoloader.php ファイルを導入することもできます。次に、balancer.php という名前の PHP スクリプトを作成します。スクリプトでは、まず Workerman の Autoloader ファイルを導入し、関連するクラス ライブラリをロードする必要があります。

<?php
require_once '/path/to/your/workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanProtocolsHttp;

次に、クライアントのリクエストをリッスンし、そのリクエストをクラスター内のサーバーに分散するワーカー インスタンスを作成します。

$balancer = new Worker('tcp://0.0.0.0:8080');
$balancer->name = 'LoadBalancer';
$balancer->count = 4;

$balancer->onConnect = function($connection) {
    // 连接到达时,选择一个服务器进行负载均衡
    $servers = array('tcp://server1.com:8888', 'tcp://server2.com:8888', 'tcp://server3.com:8888');
    $connection->backendConnection = new Connection($servers[array_rand($servers)]);
};

$balancer->onMessage = function($connection, $data) {
    // 接收到消息时,将消息发送给后端服务器
    $connection->backendConnection->send($data);
};

$balancer->onClose = function($connection) {
    // 连接关闭时,关闭后端服务器的连接
    $connection->backendConnection->close();
};

上記のコードは、LoadBalancer という名前の Worker インスタンスを作成し、ポート 8080 をリッスンします。接続が到着するたびに、サーバーをランダムに選択することによって、接続がバックエンド サーバーに分散されます。メッセージを受信すると、メッセージはバックエンド サーバーに送信されます。接続が閉じられたら、バックエンド サーバーへの接続を閉じます。

最後に、balancer.php スクリプトを実行し、ターミナルで次のコマンドを実行します。

php balancer.php start

ロード バランサーを開始した後、クライアントのリクエストをクラスター内の各サーバーに分散できます。

  1. 分散共有メモリの使用

分散共有メモリは、複数のサーバー間で共有されるデータを保存するテクノロジです。 Workerman では、Redis を分散共有メモリとして使用できます。 Redis は、永続ストレージをサポートし、豊富なデータ構造と操作コマンドを提供するオープンソースのインメモリ データベースです。

分散共有メモリを使用するには、最初に Redis サーバーをインストールして構成する必要があります。次に、Workerman のスクリプトで、Redis 接続を使用してデータを共有できます。

<?php
require_once '/path/to/your/workerman/Autoloader.php';
use WorkermanWorker;
use WorkermanProtocolsHttp;
use WorkermanConnectionAsyncTcpConnection;

$worker = new Worker('tcp://0.0.0.0:8888');
$worker->name = 'Server';
$worker->onWorkerStart = function($worker) {
    // 连接Redis服务器
    $redis_connection = new AsyncTcpConnection('tcp://redis.server:6379');
    $redis_connection->connect();
    
    // 将服务器的信息保存到Redis
    $worker->addListener = function($connection) use($redis_connection) {
        $redis_connection->lPush('servers', $connection->getRemoteAddress());
    };
    
    // 从Redis获取服务器列表,用于负载均衡
    $worker->onMessage = function($connection, $data) use($redis_connection) {
        $redis_connection->lRange('servers', 0, -1, function($result) use($connection, $data) {
            // 根据负载均衡策略选择一个服务器
            $server = $result[array_rand($result)];
            
            // 将消息发送给选定的服务器
            $backend_connection = new AsyncTcpConnection('tcp://' . $server);
            $backend_connection->send($data);
            
            // 接收后端服务器的响应,并发送给客户端
            $backend_connection->onMessage = function($connection, $backend_data) use($connection) {
                $connection->send($backend_data);
            };
            
            // 关闭后端服务器的连接
            $backend_connection->onClose = function($connection) {
                $connection->close();
            };
        });
    };
    
    // 在服务器关闭时,从Redis中移除服务器的信息
    $worker->onClose = function($connection) use($redis_connection) {
        $remote_address = $connection->getRemoteAddress();
        $redis_connection->lRem('servers', $remote_address, 1);
    };
};

上記のコードは、Server という名前の Worker インスタンスを作成し、ポート 8888 をリッスンします。 Worker インスタンスの onWorkerStart コールバック関数では、最初に Redis サーバーに接続し、その後クライアント要求が受信されるたびに、Redis 接続を通じてサーバーのリストが取得され、負荷分散ポリシーに従ってサーバーが選択され、リクエストはサーバーに転送されます。バックエンドサーバーからの応答を受信したら、クライアントに応答を返します。サーバーがシャットダウンされたら、Redis からサーバー情報を削除します。

最後に、server.php スクリプトを実行し、ターミナルで次のコマンドを実行します。

php server.php start

サーバーを起動した後、クライアント経由でサーバーに接続し、負荷分散を実現できます。

上記の 2 つの方法により、Workerman フレームワークを使用してサーバー クラスターを実装できます。中央ロード バランサーを使用する場合でも、分散共有メモリを使用する場合でも、システムのパフォーマンスと信頼性を向上させて、大規模なアプリケーションのニーズを満たすことができます。もちろん、実際のアプリケーションでは、特定のシナリオとニーズに基づいてサーバー クラスターの実装をさらに最適化および拡張できます。

以上がWorkerman ドキュメントのサーバー クラスターの実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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