PHPでネットワークをプログラミングする場合、 socket_last_error()とsocket_clear_error()は、主にソケット接続のエラー情報を管理および処理するために使用される2つの非常に重要な関数です。これらの2つの機能を正しく使用すると、開発者がエラーをより効率的にキャッチおよび処理し、プログラムの堅牢性を向上させるのに役立ちます。この記事では、これら2つの関数の関数と正しい使用方法を詳細に説明し、サンプルコードを介して理解を深めます。
socket_last_error(リソース$ socket = null):int
この関数は、指定されたソケット接続の最後のエラーコードを取得するために使用されます。ソケットパラメーターが渡されない場合、グローバルな最後のエラーコードが返されます。このエラーコードは、異なるエラータイプを表す整数です。
socket_clear_error(リソース$ socket = null):void
この関数は、指定されたソケット接続のエラーステータスをクリアするために使用されます。ソケットパラメーターが渡されない場合、グローバルエラー状態がクリアされます。エラーをクリアした後、 socket_last_error()を呼び出すと再び0が戻り、エラーがないことを示します。
ソケット操作を実行すると、エラーメッセージはソケットのエラー状態に保持されます。時間内にクリアされていない場合、その後のsocket_last_error()への呼び出しは以前のエラーを返し続け、新しいエラーと古いエラーを区別できないようになります。
したがって、推奨されるアプローチは次のとおりです。
最初のsocket_last_error()を呼び出して、現在のエラーステータスを取得します。
エラーコードによると、対応する処理が実行されます。
処理が完了したら、 socket_clear_error()を呼び出してエラーをクリアして、後続の呼び出しが新しいエラーステータスを正確に取得できるようにします。
<?php
// aを作成します TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "作成する socket 失敗,エラーコード: " . socket_last_error() . "\n";
socket_clear_error(); // グローバルエラーステータスをクリアします
exit;
}
// 指定されたサーバーとポートに接続してみてください
$result = socket_connect($socket, 'm66.net', 80);
if ($result === false) {
$errorCode = socket_last_error($socket);
echo "连接失敗,エラーコード: {$errorCode}\n";
// 根据エラーコード做不同处理,たとえば、再試行するか、ロギングしてください
// ...
socket_clear_error($socket); // クリア socket エラーステータス,後続の操作に影響を及ぼさないでください
} else {
echo "接続に正常に!\n";
}
// 閉鎖 socket
socket_close($socket);
?>
エラー状態はソケットリソースにバインドされているため、特にマルチソケット接続シナリオで、グローバルエラー状態を使用しないように呼び出すときに、対応するソケットリソースを明示的に渡すのが最善です。
エラーメッセージの繰り返しの読み取りと判断エラーの原因を避けるために、エラーステータスを時間内にクリアします。
エラーを処理した後に状態をクリアしない場合、 Socket_last_error()への後続の呼び出しは古いエラーコードを返し、プログラムロジックに影響を与える可能性があります。
Socket_last_error()を使用して、現在のソケットの最後のエラーコードを取得します。
エラーを処理した後、 socket_clear_error()を呼び出してエラー状態をクリアします。
グローバルおよびローカルエラーの状態を混乱させないように、特定のソケットリソースを渡します。
これら2つの機能を正しく使用すると、PHPソケットプログラミングがより堅牢でデバッグが簡単になります。