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 のバージョン情報を表示し、拡張機能が正しくインストールされていることを確認します。
Swoole を使用して Websocket サーバーを開発する前に、まずサービス インスタンスを作成する必要があります。 # Swoole が提供するクラス <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class='brush:php;toolbar:false;'>$server = new SwooleWebSocketServer('0.0.0.0', 9501);</pre><div class="contentsignin">ログイン後にコピー</div></div>
このうち、
は使用可能なすべての IP アドレスでリッスンすることを意味し、9501
は使用可能な IP アドレスでリッスンすることを意味しますポート番号。インスタンスを作成した後、ワーカー プロセスの数の設定、動作モードの設定、TCP プロトコルの有効化など、サーバー上でいくつかの構成を実行できます。詳細については、Swoole の公式ドキュメントを参照してください。
Swoole を使用して Websocket サーバーを開発する場合は、次の側面にも注意する必要があります:
ハートビート メカニズムWebsocket プロトコルには、HTTP プロトコルのような明確なリクエストと応答がありませんが、リアルタイムのデータ送信にメッセージ プッシュを使用します。 Websocket サーバーはクライアントの接続とメッセージ送信を長時間監視する必要があるため、クライアントが切断されるとメッセージを送信できなくなります。そのため、ハートビート メカニズムを実装し、接続を維持するために定期的にクライアントにハートビート リクエストを送信する必要があります。 Swoole では、
ping//连接成功时触发 $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 では、
$server->start();
データ形式
Websocket プロトコルでは、クライアントとサーバー間で通信されるデータは JSON、XML、およびその他の形式で送信されることがあります。 data の場合は、
json_decode//心跳包 $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 を使用して Websocket サーバーを開発すると、サーバーのパフォーマンスと安定性が大幅に向上しますが、それには Swoole の関連機能と開発スキルに習熟する必要もあります。この記事が開発者にとって役立ち、高性能 Websocket サーバーをより適切に実装するための参考になれば幸いです。
以上がSwooleをベースとした高性能WebSocketサーバー開発経験の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。