PHP 소켓 프로그래밍에서 디버깅 오류는 피할 수없는 프로세스입니다. 오류 포지셔닝 및 처리를보다 효율적으로 수행하려면 Socket_Clear_Error () 기능이 특히 중요합니다. 이 기사는 실제 디버깅 프로세스 중 기능, 사용시기 및 응용 프로그램 예제를 자세히 소개하여 개발자가 소켓 오류 상태를보다 정확하게 관리 할 수 있도록 도와줍니다.
socket_clear_error ()는 마지막 소켓 오류 메시지를 지우는 데 사용되는 함수입니다. 특정 소켓 리소스에 작용하거나 전달하지 않고 매개 변수를 전달할 수 있으므로 전역 오류 메시지를 지 웁니다.
기능 프로토 타입은 다음과 같습니다.
socket_clear_error(?Socket $socket = null): void
매개 변수 $ 소켓은 선택 사항입니다. 제공된 경우 소켓의 오류 메시지가 지워집니다. 생략하면 글로벌 오류 상태가 지워집니다.
PHP 소켓 API ( Socket_connect () , Socket_write () , Socket_read () 등을 사용하는 경우 오류가 발생하면 이러한 오류는 내부 상태에 저장됩니다. 오류 코드는 socket_last_error () 를 통해 얻을 수 있습니다. 그러나이 오류 상태는 누적 입니다. 적극적으로 지우지 않으면 후속 판단 논리에 영향을 줄 수 있습니다.
예를 들어, 연결 시도를 한 다음 성공적으로 연결하지 못했습니다. socket_clear_error ()가 호출되지 않은 경우, 오류 상태는 여전히 이전에 실패한 정보입니다.
$host = 'm66.net';
$port = 80;
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$attempts = 0;
$connected = false;
while ($attempts < 3 && !$connected) {
socket_clear_error($socket); // 이전 오류 상태를 지우십시오
$connected = @socket_connect($socket, $host, $port);
if (!$connected) {
$errCode = socket_last_error($socket);
echo "먼저 시도하십시오 " . ($attempts + 1) . " 두 번째 연결이 실패했습니다,실수:" . socket_strerror($errCode) . "\n";
sleep(1);
}
$attempts++;
}
위의 예에서, socket_clear_error () 가 호출되지 않으면 매번 얻는 오류 코드가 이전 시간의 결과 일 수 있으므로 잘못 판단됩니다.
소켓이 프로그램의 정상 상태인지 여부를 결정하려면 일반적으로 socket_last_error () 와 함께 사용됩니다. 판결을 방해하는 이전 작업이 방해를 피하기 위해 상태를 얻기 전에 socket_clear_error ()를 호출하는 것이 가장 좋습니다.
socket_clear_error($socket);
$status = socket_get_status($socket);
if ($status['eof']) {
echo "원격 호스트가 연결을 닫았습니다。\n";
}
비 블로킹 모드에서 읽고 쓰는 경우 많은 작업이 임시 오류 (예 : Eagain 또는 EwouldBlock )를 반환 할 수 있으며, 이는 반드시 치명적인 오류를 나타내지는 않습니다. 이 시점에서 socket_clear_error ()를 호출하는 것은 논리를 명확하게 유지하는 열쇠입니다.
socket_set_nonblock($socket);
$result = @socket_read($socket, 2048);
if ($result === false) {
$error = socket_last_error($socket);
if ($error === SOCKET_EWOULDBLOCK || $error === SOCKET_EAGAIN) {
// 일시적으로 읽을 수 없습니다,나중에 다시 시도하십시오
socket_clear_error($socket);
} else {
echo "작동이 실패했습니다:" . socket_strerror($error) . "\n";
}
}
오류가 자동으로 지워질 것이라고 말을 걸었습니다 . 많은 초보자들은 다음 작업에서 오류 상태가 자동으로 지워질 것이라고 생각하지만 실제로는 그렇지 않습니다. socket_clear_error ()는 명시 적으로 호출해야합니다.
지정된 소켓의 클리어런스를 무시하십시오 . 여러 소켓 리소스를 관리하는 경우 다른 소켓의 상태를 우연히 지우지 않도록 해당 리소스 핸들을 특정 소켓으로 전달하십시오.
소켓 애플리케이션을 디버깅 할 때 socket_clear_error ()를 사용하는 것은 선택 사항이 아니라 현재 소켓 상태를 정확하게 이해할 수 있는지 여부를 결정하는 핵심 단계입니다. 오류 처리, 상태 판단 및 비 차단 커뮤니케이션에서 중요한 역할을합니다. 그것을 사용하는 데 능숙하면 디버깅 효율성과 프로그램 견고성을 크게 향상시킬 수 있습니다.