PHPのソケットでプログラミングする場合、 socket_read()はソケットからデータを読み取る共通の関数です。ただし、実際のアプリケーションでは、ネットワーク条件または接続の問題によりsocket_read()が失敗する可能性があり、その結果、残留エラーコードが生じます。プログラムの安定性と堅牢性を確保するには、時間内にエラーをクリアし、読み取り障害後に再試行する必要があります。この時点で、 socket_clear_error()関数は役立ちます。
この記事では、エラー処理と再試行のためにsocket_read()とsocket_clear_error()を組み合わせる方法を詳細に紹介します。
socket_read()は、構文を次のように読み取るために使用されます。
socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ): string|false
$ソケット:ソケットリソース。
$ length :読み取る最大バイト数。
$タイプ:読み取りタイプ、デフォルトでバイナリ読み取り。
読み取りが成功した場合、読み取り文字列が返されます。失敗した場合、 falseは返されます。
socket_read()が失敗すると、エラーステータスがソケット内に残され、後続の操作に影響する可能性があります。たとえば、 socket_last_error()は最後のエラーコードを返します。エラー状態がクリアされていない場合、プログラムは常にエラー状態にある可能性があり、その結果、繰り返し障害が発生します。
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);
?>
ソケットに作成して接続します。ここでは、 M66.netのポートに接続します。
ループの読み取り試行データ:最大3つの読み取りが試行され、失敗した場合、エラー処理が実行されます。
失敗処理:
socket_last_error()を介してエラーコードを取得します。
socket_strerror()を使用して、エラーの説明を取得します。
socket_clear_error()を呼び出して、エラー状態をクリアします。
もう一度やり直してから1秒待ってください。
読み取りが正常に行われると、データが印刷され、ループが終了します。
接続を閉じて、リソースをリリースします。
socket_read()を使用してデータを読み取るときに障害が発生したら、 socket_clear_error()を呼び出してエラーをクリアすることを忘れないでください。これにより、エラーの蓄積を回避し、次の操作の正しい実行を確保できます。同時に、再試行メカニズムと組み合わせて、ネットワーク通信の安定性を改善することができます。