Workerman は、PHP が非同期ネットワーク通信をより効率的に処理できるようにする高性能 PHP ソケット フレームワークです。 Workerman のドキュメントには、サーバー クラスターの実装方法に関する詳細な手順とコード例が記載されています。
サーバー クラスターを実装するには、まずサーバー クラスターの概念を明確にする必要があります。サーバー クラスターは複数のサーバーをネットワークに接続し、負荷とリソースを共有することでシステムのパフォーマンス、信頼性、拡張性を向上させます。 Workerman では、サーバー クラスタリングは 2 つの方法で実装できます。1 つは中央ロード バランサを使用する方法、もう 1 つは分散共有メモリを使用する方法です。
まず、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
ロード バランサーを開始した後、クライアントのリクエストをクラスター内の各サーバーに分散できます。
分散共有メモリは、複数のサーバー間で共有されるデータを保存するテクノロジです。 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 サイトの他の関連記事を参照してください。