このセクションでは、Workermanを活用してカスタムイベント放送局を構築する方法について詳しく説明します。高性能PHPフレームワークであるWorkermanは、非同期のイベント駆動型アーキテクチャのため、このタスクに適しています。核となるアイデアは、リアルタイムアプリケーションを構築するために設計されたWorkermanのGatewayWorker
コンポーネントを利用することです。このコンポーネントを使用すると、メインプロセスをブロックせずに複数のクライアント接続を同時に管理できます。
まず、Workermanをインストールする必要があります。 composer require workerman/workerman
。次に、 GatewayWorker
アプリケーションを作成します。基本構造には、 Gateway
とBusinessWorker
プロセスが含まれます。 Gateway
クライアントの接続を処理し、ブロードキャストを管理し、 BusinessWorker
イベントを処理し、ブロードキャストのためにGateway
に送信します。
<code class="php">// Events.php (BusinessWorker) <?php require_once __DIR__ . '/../vendor/autoload.php'; use Workerman\Worker; use Workerman\Lib\Timer; $worker = new Worker(); $worker->count = 4; // Adjust based on your needs $worker->onWorkerStart = function($worker) { // Example: Simulate event generation Timer::add(1, function() use ($worker) { $eventData = ['type' => 'new_message', 'message' => 'Hello from BusinessWorker!']; // Send the event to the Gateway Gateway::sendToAll($eventData); }); }; Worker::runAll();</code>
<code class="php">// start.php (Gateway) <?php require_once __DIR__ . '/../vendor/autoload.php'; use Workerman\Worker; use GatewayWorker\Gateway; // Gateway process $gateway = new Gateway("websocket://0.0.0.0:8282"); $gateway->name = 'Gateway'; // BusinessWorker process $worker = new Worker(); $worker->count = 4; // Adjust based on your needs $worker->registerAddress('127.0.0.1:2207'); Worker::runAll();</code>
この単純化された例は、基本的な流れを示しています。 BusinessWorker
はイベントを生成し(例を実際のイベントソースに置き換えます)、 Gateway
それらをすべての接続されたクライアントにブロードキャストします。クライアントは、 start.php
で指定されたWebsocketサーバーに接続します。これらのイベントの受信と処理を処理するには、クライアント側のロジックを実装する必要があります。システムリソースと予想される負荷に基づいて、ワーカーカウントを調整することを忘れないでください。エラー処理とより洗練されたイベント管理を、制作可能なアプリケーションに追加する必要があります。
Workermanベースのイベント放送局でのパフォーマンスの最適化には、いくつかの重要な領域に注意が必要です。
count
プロパティ)を調整する必要があるかもしれません。取り扱いルーチンでは、不必要なオーバーヘッドを避けてください。Workermanは、特に上記のように最適化された場合、リアルタイムで大量のイベント放送を効率的に処理できます。その非同期アーキテクチャはブロッキングを防ぎ、大幅なパフォーマンス劣化なしに多数の同時接続とイベントを処理できるようにします。ただし、スケーリングは依然として重要です。効率は、システムリソース(CPU、メモリ、ネットワーク帯域幅)、イベントボリューム、および放送のイベントのサイズに大きく依存します。非常に高い量については、ロードバランス技術を使用して、複数のWorkermanサーバーに負荷を分散することを検討してください。労働者のプロセスの数を適切に調整し、効率的な放送戦略を実装することは、高負荷の下でパフォーマンスを最大化するための鍵です。
データベースをWorkermanベースのイベント放送局と統合すると、イベントの永続的なストレージを提供し、履歴データの取得やオフラインアクセスなどの機能を有効にします。ただし、イベントループのブロックを避けるために、データベースの相互作用を非同期に実行する必要があります。
非同期データベースドライバー(たとえば、約束やコールバックをサポートするドライバー)を使用して、データベースと対話できます。イベントが生成されたら、データベースに非同期に保存します。これにより、データベース操作が完了するのを待っている間、メインイベントループがブロックされないようになります。メッセージキュー(rabbitmqやredisなど)を使用して、イベントの生成とデータベースのストレージプロセスを分離することを検討してください。 BusinessWorker
キューにイベントを公開することができ、別の労働者はこれらのイベントを消費してデータベースに保存できます。これにより、応答性とスケーラビリティが向上します。
たとえば、非同期PHPデータベースライブラリを使用して、 BusinessWorker
に統合できます。イベントをゲートウェイに送信した後、非同期関数を使用してデータベースにコピーを保存します。これにより、イベントを受信する前にクライアントが切断されたとしても、イベントがまだ保存されていることが保証されます。潜在的なデータベースエラーを優雅に処理することを忘れないでください。適切なデータベーステクノロジー(MySQL、PostgreSQL、MongoDBなど)を選択することは、特定のニーズとパフォーマンス要件に依存します。
以上がWorkermanを使用してカスタムイベント放送局を構築するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。