現在の位置: ホーム> 最新記事一覧> socket_accept()を使用して低遅延ネットワークサービスを実装するためのヒント

socket_accept()を使用して低遅延ネットワークサービスを実装するためのヒント

M66 2025-05-31

効率的なネットワークサービスを構築する場合、レイテンシは避けられない重要な指標です。一般的なスクリプト言語として、PHPはネットワークプログラミングのリッチAPIも提供します。ここでは、 Socket_Accept()関数がサーバー側の接続受信を処理するためによく使用されます。それは比較的単純で使用されますが、低遅延および高電通信サービスを構築する場合は、一連の最適化手法と実用的なアプリケーション方法をマスターする必要があります。

1。socket_accept()の紹介

socket_accept()は、リスニングソケットからの接続要求を受け入れるためにPHPソケット拡張機能によって提供される関数です。サーバーがSocket_create()socket_bind()を介してソケットを作成してバインドすると、 socket_listen()がリスニングを開始し、 socket_accept()を介してクライアントの接続を受信できます。

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 8080);
socket_listen($socket);

while (true) {
    $client = socket_accept($socket);
    if ($client) {
        socket_write($client, "訪問してください m66.net ネットワークサービス\n");
        socket_close($client);
    }
}

上記のコードは基本的なTCPサーバーを構築しますが、そのパフォーマンスは「低レイテンシ」要件を満たすことにはほど遠いものです。

2。なぜ遅延があるのですか?よくある質問

  1. I/O <br>のブロックによって引き起こされる遅延 デフォルトでは、 socket_accept()はブロッキングコールです。つまり、クライアント接続がない場合、スクリプトはその行で停止し、CPU時間を無駄にし、その後の論理処理をブロックすることを意味します。

  2. シリアル処理接続<br> 一度に1つのクライアントリクエストのみが処理されますが、これには同時実行機能がなく、キューが発生し、遅延が増加します。

  3. 不適切なリソース管理<br> タイムアウトの設定ではなく、バッファーを適切に設定しないことを時間的にリリースしないと、すべて応答速度に影響する場合があります。

3。低レイテンシ最適化手法

1.非ブロッキングモードを使用するか、select()と協力します

socket_set_nonblock()を介して非ブロッキングモードを設定することも、 socket_select()を使用して複数のソケットを聴くために、ブロッキングや待機を避けることもできます。

 socket_set_nonblock($socket);

$clients = [$socket];
while (true) {
    $read = $clients;
    if (socket_select($read, $write = null, $except = null, 0, 200000)) {
        foreach ($read as $sock) {
            if ($sock === $socket) {
                $client = socket_accept($socket);
                if ($client !== false) {
                    socket_set_nonblock($client);
                    $clients[] = $client;
                    socket_write($client, "訪問してください m66.net!\n");
                }
            } else {
                $data = socket_read($sock, 1024, PHP_NORMAL_READ);
                if ($data === false || $data === "") {
                    $index = array_search($sock, $clients);
                    socket_close($sock);
                    unset($clients[$index]);
                } else {
                    socket_write($sock, "あなたはそれを送った: $data");
                }
            }
        }
    }
}

2.合理的なタイムアウトパラメーターを設定します

受信と送信のタイムアウト時間は、socket_set_option()を介して制御することができ、接続の問題によるブロッキングを避けます。

 socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>1, "usec"=>0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ["sec"=>1, "usec"=>0]);

3. epollまたはイベントを使用して拡張します(高い並行性シナリオ)

何千もの接続を携帯する必要がある高電流アプリケーションの場合、 LibeventSwooleなどの拡張機能を使用することをお勧めします。彼らは、より効率的なepoll/kqueueモデルを下部に使用し、I/Oのレイテンシを大幅に削減します。

 // 使用 Swoole 实现高性能ネットワークサービス
$server = new Swoole\Server("0.0.0.0", 9501);

$server->on("connect", function ($server, $fd) {
    $server->send($fd, "訪問してください m66.net ネットワークサービス\n");
});

$server->on("receive", function ($server, $fd, $reactor_id, $data) {
    $server->send($fd, "あなたはそれを送った:$data");
});

$server->on("close", function ($server, $fd) {
    echo "クライアント {$fd} 閉じた\n";
});

$server->start();

4。実用的なアプリケーションシナリオ

  • リアルタイムのデータ収集サービス:非ブロッキングソケットを介してIoTデバイスからリアルタイムデータを受信します。

  • オンラインチャットルーム:Swooleを使用して、高い並行チャットサービスを構築すると、すべてのデータ交換が低レイテンシを維持します。

  • ゲームサーバーバックエンド:小規模なバトルゲームは、ネイティブソケットを使用して、低遅延のプレーヤー通信を実現できます。

  • APIゲートウェイ:中間層ソケットサービスを構築して、リクエストを受信し、キャッシュデータにすばやく応答します。

5。概要

Socket_Accept()はPHPの基本的な機能であり、真に低い遅延サービスを構築するために、非ブロッキングI/Oの使用、合理的なリソース制御、並行性モデルなどの複数の次元から最適化する必要があります。上記のスキルの助けを借りて、PHP環境でさえ、応答性があり安定したサーバー側アーキテクチャを作成し、ビジネスに強固な技術サポートを提供することができます。