Socket_last_error()は、PHPを使用してネットワークをプログラミングする際に非常に重要なデバッグツールです。最新のソケット操作で発生したエラーコードを取得し、問題を見つけるのに役立ちます。ただし、多くの開発者は、次のことを報告しています。Socket_Last_Error ()は、例外が明確に存在している場合でも常に0を返します。これにより、デバッグが非常に困難になります。この記事では、この現象の根本原因を詳細に分析し、見落とす可能性のある重要なポイントを分析します。
socket_last_error()関数の関数は、指定されたソケットリソースで発生する最後のエラーコードを返すことです。ソケットリソースが渡されない場合、現在のデフォルトソケットのエラーコードが返されます。関数は、最後の操作のエラーコードのみを返すことに注意し、コールが成功するか、エラーがクリアされると、その値はリセットされます。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "ソケットの作成に失敗しました,エラーコード:" . socket_last_error() . "\n";
}
通常、 socket_last_error()が常に0を返す一般的な理由がいくつかあります。
socket_last_error()ソケットが指定されていない場合、デフォルトソケットのエラーステータスが返されます。複数のソケットを使用している場合、または明示的に指定されていない場合、0が返されます。
// エラーデモンストレーション,ソケットは指定されていません
$errorCode = socket_last_error(); // おそらくいつも0
// 正しいデモンストレーション
$errorCode = socket_last_error($socket);
ソケット操作が正常に実行されると、エラーコードが0にリセットされます。さらに、 socket_clear_error()を呼び出すと、以前のエラーステータスもクリアされます。
// 操作前にエラーを検出します
$errorCode = socket_last_error($socket);
// 正常に呼び出された場合 socket_connect または socket_write,エラーがクリアされている可能性があります
socket_clear_error($socket);
// 現時点では socket_last_error() 戻ります 0
操作は異常であると思うことがありますが、実際にはビジネスロジックや他の場所のエラーであり、ソケット自体がエラーを生成しません。したがって、 socket_last_error()が0を返すのは正常です。
上記の注意事項と組み合わせて、次のモードを使用してエラーをデバッグすることをお勧めします。
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "ソケットの作成に失敗しました,エラーコード:" . socket_last_error() . "\n";
exit;
}
$result = socket_connect($socket, "gitbox.net", 80);
if ($result === false) {
$err = socket_last_error($socket);
echo "接続に失敗しました,エラーコード:$err - " . socket_strerror($err) . "\n";
} else {
echo "接続に正常に!\n";
}
正確なエラー情報を取得するには、 socket_last_error()をソケットリソースに渡す必要があることに注意することが特に重要です。
エラーメッセージのクリーニング: socket_clear_error($ socket)を呼び出す場合、 socket_last_error($ socket)を呼び出します0。
非同期操作または非ブロッキング操作:非同期または非ブロッキングソケット操作では、一部のエラーはすぐにsocket_last_error()に反映されない場合があり、他の状態と組み合わせて確認する必要があります。
エラーコード変換: socket_strerror()を使用して、エラーコードを理解しやすいエラー説明に変換します。
socket_last_error()の使用を理解して修正すると、エラーコードが常に0であるため、ネットワークデバッグ効率を大幅に改善し、誤判断を回避できます。