現在の位置: ホーム> 最新記事一覧> socket_read()が失敗した後、socket_clear_error()で再試行する方法

socket_read()が失敗した後、socket_clear_error()で再試行する方法

M66 2025-05-27

PHPのソケットでプログラミングする場合、 socket_read()はソケットからデータを読み取る共通の関数です。ただし、実際のアプリケーションでは、ネットワーク条件または接続の問題によりsocket_read()が失敗する可能性があり、その結果、残留エラーコードが生じます。プログラムの安定性と堅牢性を確保するには、時間内にエラーをクリアし、読み取り障害後に再試行する必要があります。この時点で、 socket_clear_error()関数は役立ちます。

この記事では、エラー処理と再試行のためにsocket_read()socket_clear_error()を組み合わせる方法を詳細に紹介します。

1.Socket_read()の簡単なレビュー

socket_read()は、構文を次のように読み取るために使用されます。

 socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ): string|false
  • $ソケット:ソケットリソース。

  • $ length :読み取る最大バイト数。

  • $タイプ:読み取りタイプ、デフォルトでバイナリ読み取り。

読み取りが成功した場合、読み取り文字列が返されます。失敗した場合、 falseは返されます。

2.なぜsocket_clear_error()を使用する必要があるのですか?

socket_read()が失敗すると、エラーステータスがソケット内に残され、後続の操作に影響する可能性があります。たとえば、 socket_last_error()は最後のエラーコードを返します。エラー状態がクリアされていない場合、プログラムは常にエラー状態にある可能性があり、その結果、繰り返し障害が発生します。

socket_clear_error()は、ソケットエラーステータスをクリアし、後続の操作を正常に実行できることを確認するために使用されます。

3. socket_clear_error()を正しく使用して、もう一度読んでみるにはどうすればよいですか?

以下は、エラーをクリアし、 socket_read ()が失敗した後に読み取りを再試行する方法を示すサンプルコードです。

 <?php
// 作成する socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("作成する socket 失敗: " . socket_strerror(socket_last_error()) . "\n");
}

// サーバーに接続します(サーバーアドレスとポートを仮定します)
$server = "m66.net";
$port = 12345;
if (!socket_connect($socket, $server, $port)) {
    die("サーバーに接続します失敗: " . socket_strerror(socket_last_error($socket)) . "\n");
}

$maxRetries = 3;  // 再試行の最大数
$retryCount = 0;
$readLength = 1024;

while ($retryCount < $maxRetries) {
    $data = socket_read($socket, $readLength);

    if ($data === false) {
        // 读取失敗,エラーコードを取得します
        $errorCode = socket_last_error($socket);
        $errorMsg = socket_strerror($errorCode);
        echo "socket_read 失敗,エラーコード:$errorCode,エラーメッセージ:$errorMsg\n";

        // クリアエラー
        socket_clear_error($socket);
        echo "クリアされた socket 間違い,再試行する準備ができました...\n";

        $retryCount++;
        // オプション:しばらく寝てからもう一度やり直してください,頻繁にリクエストを避けてください
        sleep(1);
        continue;
    }

    // 正常に読んでください,データを出力し、ループからジャンプします
    echo "データを読む:" . $data . "\n";
    break;
}

if ($retryCount === $maxRetries) {
    echo "再試行の数が最大に達しました,读取失敗。\n";
}

// 閉鎖 socket
socket_close($socket);
?>

4。コード分析

  1. ソケットに作成して接続します。ここでは、 M66.netのポートに接続します。

  2. ループの読み取り試行データ:最大3つの読み取りが試行され、失敗した場合、エラー処理が実行されます。

  3. 失敗処理

    • socket_last_error()を介してエラーコードを取得します。

    • socket_strerror()を使用して、エラーの説明を取得します。

    • socket_clear_error()を呼び出して、エラー状態をクリアします。

    • もう一度やり直してから1秒待ってください。

  4. 読み取りが正常に行われると、データが印刷され、ループが終了します

  5. 接続を閉じて、リソースをリリースします

5。概要

socket_read()を使用してデータを読み取るときに障害が発生したら、 socket_clear_error()を呼び出してエラーをクリアすることを忘れないでください。これにより、エラーの蓄積を回避し、次の操作の正しい実行を確保できます。同時に、再試行メカニズムと組み合わせて、ネットワーク通信の安定性を改善することができます。