現在の位置: ホーム> 最新記事一覧> socket_set_blockを使用して、長い接続ポリシーをチューニングします

socket_set_blockを使用して、長い接続ポリシーをチューニングします

gitbox 2025-05-28

PHPの開発では、長い接続を処理する際のパフォーマンスと応答速度が重要な考慮事項です。 PHPデフォルトソケット操作はブロックされています。つまり、プログラムが読み取りまたは書き込み操作を呼び出すと、操作が完了するまで待機し、長い接続を処理するときにパフォーマンスボトルネックを簡単に引き起こす可能性があります。この目的のために、 Socket_set_block関数は、Socketのブロッキングモードを調整するために合理的に使用され、PHP Long Connectionsのパフォーマンスを効果的に最適化できます。


socket_set_blockとは何ですか?

socket_set_blockは、ソケットブロッキングモードを設定するPHPの関数です。その目的は、ソケットのブロックを維持することです。ブロッキングモードでは、読み取りまたは書き込み操作は、データの準備ができているか、操作が完了するまで待機します。

 bool socket_set_block ( resource $socket )
  • パラメーター$ソケット:ブロッキングモードを設定するソケットリソース。

  • 返品値:成功した場合はtrueを返し、失敗した場合はfalseを返します。

これに対応するのは、 socket_set_nonblockです。これは、非ブロッキングモードの設定に使用されます。


ブロッキングモードと非ブロッキングモードの違い

  • ブロッキングモード:読み取りおよび書き込み操作を実行するとき、プログラムは操作が完了またはタイムアウトするまで待ちます。

  • 非ブロッキングモード:読み取りおよび書き込み操作を実行すると、プログラムはすぐに戻り、データがない場合があります。

長い接続で、ブロッキングモードを使用すると、データを待っている間にプログラムが掛けられ、その結果、他のリクエストを時間内に処理できなくなります。非ブロッキングモードは同時性を改善する可能性がありますが、コードの複雑さを高めるには、追加の投票と州の判断が必要です。


socket_set_blockで長い接続性能を最適化します

ブロッキングモードと非ブロッキングモードを合理的に切り替えることで、PHPは長いつながりでパフォーマンスと応答性の両方を考慮することができます。具体的な戦略には次のものがあります。

1.接続を確立した後、最初に非ブロッキングモードを使用してデータを待機します

接続が確立されたばかりの場合、データを待っているためにプログラムがぶら下がっていないように、非ブロッキングモードに設定されます。

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_nonblock($socket);

2。ブロッキングが必要であると判断されたら、ブロッキングモードに切り替えます

たとえば、固定長データを読み取る準備をするときは、ブロッキングモードを使用して、データがそのまま読み取られ、ハーフパケットの問題を回避します。

 socket_set_block($socket);
$data = socket_read($socket, 1024);

3.Socket_Selectを使用して、ソケットのステータスを監視します

socket_selectを使用して、ソケットに読み取りおよび削減するデータがあるかどうかを検出します。

 $read = [$socket];
$write = $except = null;
if (socket_select($read, $write, $except, 5) > 0) {
    socket_set_block($socket);
    $data = socket_read($socket, 1024);
    // データの処理
} else {
    // タイムアウト処理またはその他のロジック
}

コード例:socket_set_blockを使用して、長い接続読み取りを最適化します

<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create failed: " . socket_strerror(socket_last_error()));
}

$result = socket_connect($socket, "gitbox.net", 80);
if ($result === false) {
    die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}

// 最初に非ブロッキングを設定します,プログラムが立ち往生しないでください
socket_set_nonblock($socket);

// リクエストを送信します
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: keep-alive\r\n\r\n";
socket_write($socket, $request, strlen($request));

// 使用 socket_select データが読みやすくなるのを待ちます
$read = [$socket];
$write = $except = null;
$timeout_sec = 5;

if (socket_select($read, $write, $except, $timeout_sec) > 0) {
    // データの準備ができたら、ブロッキングモードに切り替えます,完全なデータが読み取られていることを確認してください
    socket_set_block($socket);
    $response = '';
    while ($out = socket_read($socket, 2048)) {
        $response .= $out;
        if (strlen($out) < 2048) {
            break;
        }
    }
    echo $response;
} else {
    echo "データのタイムアウトまたはデータがないのを待っています";
}

socket_close($socket);
?>

要約します

  • socket_set_blockを使用すると、Socket操作は、決定された長さのデータを読み取り、整合性を確保するのに適したブロッキングモードに入ることができます。

  • 非ブロッキングモードとsocket_selectを合理的に一致させて、長いつながりのプログラムを不必要に待つことを避け、パフォーマンスを向上させます。

  • 長い接続パフォーマンスを最適化するための鍵は、ブロッキングとノンブロッキングを柔軟に制御し、イベント検出メカニズムと組み合わせてリソース廃棄物を減らすことです。

上記の方法により、PHP Long Connection Processingはより効率的で安定しており、高性能および応答時間要件を備えたネットワークアプリケーションシナリオに適しています。