ホームページ >PHPフレームワーク >Swoole >Swooleをベースとした高性能WebSocketサーバー開発経験

Swooleをベースとした高性能WebSocketサーバー開発経験

WBOY
WBOYオリジナル
2023-06-14 11:48:02864ブラウズ

Websocket は、TCP に基づく全二重通信プロトコルで、クライアントとサーバーがリアルタイムでデータをやり取りできるようにします。 Websocket プロトコルは、リアルタイム データ送信やオンライン ゲームなどのアプリケーション シナリオに適しています。HTTP プロトコルとは異なり、Websocket は長時間の接続を維持できるため、リクエストごとに TCP 接続を確立する必要がある HTTP プロトコルの欠点を回避できます。 。そのため、データ送信に Websocket プロトコルを使用する製品が増えています。

Websocket サーバーのパフォーマンスを向上させるために、開発に Swoole 拡張機能を使用できます。 Swoole は、一般的に使用されている高性能 PHP ネットワーク通信フレームワークであり、非同期イベント駆動モデルに基づいており、React や Node.js などの高性能フレームワークで一般的に使用されるコルーチンを実装しており、PHP のパフォーマンスを大幅に向上させます。この記事では、Swoole で高性能 Websocket サーバーを開発する方法を紹介し、関連するいくつかの経験を共有します。

1. Swoole サービスを開始する

Swoole サービスを開始する前に、まず Swoole 拡張機能をインストールする必要があります。 Swoole は、Windows、Linux、macOS などの一般的なオペレーティング システムをサポートしています。pecl コマンドを使用して拡張機能をインストールするか、Swoole 公式 Web サイトからソース コードをダウンロードしてコンパイルとインストールを行うことができます。ここでは pecl コマンドのインストールを例に挙げます。

pecl install swoole

インストールが完了したら、PHP コードで swoole_version() 関数を使用して Swoole のバージョン情報を表示し、拡張機能が正しくインストールされていることを確認します。

  1. サービス インスタンスの作成

Swoole を使用して Websocket サーバーを開発する前に、まずサービス インスタンスを作成する必要があります。 # Swoole が提供するクラス <pre class='brush:php;toolbar:false;'>$server = new SwooleWebSocketServer('0.0.0.0', 9501);</pre> このうち、

0.0.0.0

は使用可能なすべての IP アドレスでリッスンすることを意味し、9501 は使用可能な IP アドレスでリッスンすることを意味しますポート番号。インスタンスを作成した後、ワーカー プロセスの数の設定、動作モードの設定、TCP プロトコルの有効化など、サーバー上でいくつかの構成を実行できます。詳細については、Swoole の公式ドキュメントを参照してください。

イベント コールバック関数の登録
  1. Websocket サーバーとクライアント間の通信は、イベント コールバック関数を通じて行われます。サービス インスタンスにコールバック関数を登録する必要があります。これにより、サービス インスタンスが適切なイベントに応答できるようになります。 Swoole には多くのコールバック関数 (onMessage、onOpen、onClose、onRequest、onHandShake など) が用意されていますが、Websocket サーバーを開発する場合、通常は次の 3 つのコールバック関数を登録する必要があります。 open イベントはクライアント上で発生します。接続が正常に確立された後、クライアントがメッセージを送信した後に message イベントがトリガーされ、接続が閉じられた後に close イベントがトリガーされます。 Swoole では、$frame オブジェクトは WebSocket メッセージのデータ本体を表し、メッセージの具体的な内容は $frame->data を通じて取得できます。

サービスの開始

    コールバック関数を登録した後、サービスを開始できます。コードは次のとおりです。 , 自動的に作成されます ワーカー プロセスとリアクター スレッドは、クライアント接続やメッセージ送信などのビジネス プロセスを処理するために使用されます。
  1. 2. Websocket サービスの開発経験

Swoole を使用して Websocket サーバーを開発する場合は、次の側面にも注意する必要があります:

ハートビート メカニズム

Websocket プロトコルには、HTTP プロトコルのような明確なリクエストと応答がありませんが、リアルタイムのデータ送信にメッセージ プッシュを使用します。 Websocket サーバーはクライアントの接続とメッセージ送信を長時間監視する必要があるため、クライアントが切断されるとメッセージを送信できなくなります。そのため、ハートビート メカニズムを実装し、接続を維持するために定期的にクライアントにハートビート リクエストを送信する必要があります。 Swoole では、

ping
    および
  1. pong
  2. メッセージを使用してハートビート メカニズムを実装できます。
//连接成功时触发
$server->on('open', function (SwooleWebSocketServer $server, $request) {
    //处理连接事件
});

//收到客户端消息时触发
$server->on('message', function (SwooleWebSocketServer $server, $frame) {
    //处理消息事件
});

//连接关闭时触发
$server->on('close', function (SwooleWebSocketServer $server, $fd) {
    //处理关闭事件
});

このうち、tick 関数はハートビート リクエストをクライアントに定期的に送信でき、onMessage コールバック関数はクライアントのハートビート応答を処理してクライアントが確実にとサーバーは接続を維持します。

メッセージ ブロードキャストWebsocket サーバーの非常に一般的なシナリオは、集中砲火やマルチプレイヤー ゲームなど、すべてのクライアントにメッセージをブロードキャストすることです。 Swoole では、

push
    メソッドを使用してメッセージをブロードキャストできます。
  1. $server->start();
  2. さらに、クライアントの接続情報に基づいて、特定のクライアントにターゲットを絞ったメッセージを送信することもできます。

データ形式

Websocket プロトコルでは、クライアントとサーバー間で通信されるデータは JSON、XML、およびその他の形式で送信されることがあります。 data の場合は、

json_decode
    を使用して JSON 形式を解析するなど、データをフォーマットする必要があります。
  1. //心跳包
    $server->tick(30000, function () use ($server) {
        foreach ($server->connections as $fd) {
            $server->push($fd, json_encode(['type' => 'ping']));
        }
    });
    
    //心跳响应
    $server->on('message', function (SwooleWebSocketServer $server, $frame) {
        if ($frame->data == 'pong') {
            //处理心跳响应
        }
    });
マルチプロセス管理

Websocket サーバーでは、大量のクライアント リクエストが発生します。サーバーの処理能力を向上させるために、次のコマンドを使用できます。 Swooleのマルチプロセス管理の特徴。 Swoole は、マスター プロセスと複数のワーカー プロセスをサポートしています。マスター プロセスはワーカー プロセスの管理に使用され、ワー​​カー プロセスは特定のクライアント リクエストの処理を担当します。サービス インスタンスを作成するときに、さまざまなサイズのリクエスト負荷に適応するようにワーカー プロセスの数を設定できます。

//处理广播消息
$message = 'Hello, everyone!';
foreach ($server->connections as $fd) {
    $server->push($fd, $message);
}
    マルチプロセス環境では、データの同期と共有の問題に注意する必要があります。Swoole が提供するプロセス、テーブル、アトミック、ミューテックスなどのコンポーネントを使用して、プロセス間の通信と同期を実現できます。 。
  1. つまり、Swoole を使用して Websocket サーバーを開発すると、サーバーのパフォーマンスと安定性が大幅に向上しますが、それには Swoole の関連機能と開発スキルに習熟する必要もあります。この記事が開発者にとって役立ち、高性能 Websocket サーバーをより適切に実装するための参考になれば幸いです。

以上がSwooleをベースとした高性能WebSocketサーバー開発経験の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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