소켓 프로그래밍에 PHP를 사용하는 경우 개발자는 겉보기에 이상한 현상이 발생할 수 있습니다. Socket_clear_Error () 함수를 호출 한 후 오류 메시지를 지우고 계속 읽기, 쓰기 또는 연결 작업을 계속하려고해도 여전히 연결을 복원 할 수 없습니다. 초보자는 종종 오류가 "지워 졌기 때문에"연결이 정상적으로 계속 작동해야한다고 생각하지만 그렇지 않습니다.
우선, socket_clear_error () 함수의 실제 함수는 소켓 객체의 현재 오류 코드를 지우는 것입니다 . 소켓 자체의 상태를 수정하지 않습니다. 다시 말해서, 오류를 "볼 수 없다"는 것이 아니라 오류의 근본 원인이 해결되었음을 의미하지는 않습니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
@socket_connect($socket, 'm66.net', 80);
if (socket_last_error($socket)) {
echo '연결이 실패했습니다,오류 코드:' . socket_last_error($socket) . "\n";
socket_clear_error($socket);
// 계속 사용하십시오Socket작문 작업을 수행합니다
$result = socket_write($socket, "GET / HTTP/1.1\r\nHost: m66.net\r\n\r\n");
if ($result === false) {
echo "쓰기 실패:" . socket_strerror(socket_last_error($socket)) . "\n";
}
}
위의 코드에서는 socket_clear_error () 가 호출 되더라도 socket_write () 가 여전히 실패 할 수 있습니다. 왜? 소켓 연결이 실패하면 내부 상태가 손상되었거나 시스템에 의해 닫혔을 수 있으므로 "오류 코드를 지우면서 연결을 되 살릴 수 없습니다.
저수준 네트워크 통신에서 연결 상태는 운영 체제에 의해 유지됩니다. 대상 서버가 연결을 거부하고 네트워크 인터럽트, 타임 아웃 등과 같은 연결이 실패하면 소켓은 오류 상태에 있습니다. 현재 오류 코드를 지우면 오류 메시지의 읽기 동작 에만 영향을 미치며 소켓의 실제 연결 상태는 변경되지 않습니다.
더 생생하게, socket_clear_error ()는 나중에 socket_last_error ()를 호출 할 때 0을 반환 할 수 있지만 소켓 자체를 더 이상 사용할 수 없을 수 있습니다.
실제 개발에서 오류가 소켓 연결에서 발생하고 계속 사용할 수 없음을 확인하면 socket_clear_error () 로 "고정"하려고 시도하는 대신 적극적으로 닫고 연결을 다시 설정 해야합니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!@socket_connect($socket, 'm66.net', 80)) {
echo "연결이 실패했습니다,다시 연결하십시오...\n";
socket_close($socket);
// 재현하고 연결하십시오
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (@socket_connect($socket, 'm66.net', 80)) {
echo "성공적으로 다시 연결하십시오\n";
} else {
echo "반복 실패:" . socket_strerror(socket_last_error($socket)) . "\n";
}
}
많은 개발자들이 소켓을 사용하여 비 블로킹 소켓이나 긴 연결을 처리 할 때 "다음 읽기 준비 및 쓰기"를 사용합니다. 기본 연결이 건강하는지 확인하는 한 괜찮습니다. 그러나 오류가 분리, 원격 연결 등으로 인한 오류가 발생하면 오류 코드가 지우더라도 다음 작업이 여전히 실패합니다.
Socket_clear_error ()는 새로운 오류의 후속 판단을 용이하게하기 위해 오류 코드를 재설정하는 도구 기능 일뿐입니다. 소켓 자체의 상태에 수리 효과가 없습니다. 연결 오류가 발생할 때 가장 안전한 작업은 현재 소켓을 닫고 연결을 재현하는 것입니다.
"명확한 오류 정보"와 "수리 연결 상태"의 차이를 명확하게 구별함으로써 소켓 통신 개발을보다 안정적으로 수행 할 수 있습니다.