PHP를 사용하여 소켓 기반 서버 프로그램을 개발할 때 디버깅은 종종 두통입니다. 특히 설명 할 수없는 연결 실패, 데이터 수신이 중단되거나 시간 초과 문제에 직면하면 개발자는 일반적으로 Socket_last_error () 및 Socket_strerror () 기능에 의존하여 오류 소스를 추적합니다. 그러나이 두 기능만으로는 가장 명확한 오류 컨텍스트를 제공 할 수 없으며 Socket_clear_error () 는 현재 특히 중요합니다.
PHP 소켓 프로그래밍에서 Socket_last_error () 는 마지막 오류 코드를 반환하는 상태 쿼리 기능입니다. 그러나이 "마지막 시간"은 당신이 상상했던 "현재 작업"이 아닐 수도 있습니다. PHP의 소켓 오류 상태는 전 세계적으로 예약되어 있으므로 명시 적으로 지우지 않는 한 새 작업을 수행하더라도 이전 작업에서 남은 오류 코드를 반환 할 수 있습니다.
예를 들어 다음 코드 :
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, '127.0.0.1', 8080);
$errCode = socket_last_error($socket);
echo socket_strerror($errCode);
socket_create () 에서 오류가 발생하고 socket_connect () 바로 다음 오류 코드를 얻으면 실제로 얻는 것은 실제로 socket_create ()에 남은 오류 일 수 있습니다. 이로 인해 디버깅에 큰 오도가 발생합니다.
이 "히스토리 오류 상태"의 간섭을 피하기 위해 각 임계 소켓 작동 전에 Socket_clear_error ()를 호출하여 이전 오류 상태를 명시 적으로 지울 수 있습니다. 이를 수행하는 가장 큰 장점은 다음 socket_last_error ()가 현재 조작 에 의해 생성 된 오류 코드를 반환하도록하는 것입니다.
예를 들어:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// 이전 오류 상태를 지우십시오
socket_clear_error($socket);
// 연결하려고 노력하십시오
if (!socket_connect($socket, '127.0.0.1', 8080)) {
$errorCode = socket_last_error($socket);
$errorMsg = socket_strerror($errorCode);
error_log("연결이 실패했습니다:[$errorCode] $errorMsg");
}
이 방법을 작성하면 연결이 실패하면 레거시 오류가 아닌이 연결 작업으로 인해 오류 코드가 발생해야한다는 것입니다.
대규모 서비스에서 개발자는 디버그 로그를 로그 서비스 또는 디스플레이 패널에 푸시하는 경향이 있습니다.
$url = 'http://m66.net/log/record.php';
$params = [
'event' => 'socket_connect_fail',
'error' => socket_strerror(socket_last_error($socket)),
];
file_get_contents($url . '?' . http_build_query($params));
Socket_clear_error ()를 미리 사용하지 않으면 여기에 전달 된 오류 메시지는 현재 실패 이벤트와 관련이 없으므로 궁극적으로 로깅을 "깨끗하지만 신뢰할 수없는"것입니다.
Try-Catch 구조를 사용하여 소켓 작업을 포장 할 때는 각 예외가 발생하기 전에 Socket_clear_error ()를 호출하는 것이 좋습니다. 이렇게하면 캐치 블록에서 얻는 오류 메시지가 "정확한"더 "정확한"것이며 여러 소켓 작업의 연속 오류로 인해 실제 오류 지점을 혼동하지 않습니다.
Socket_clear_error () 는 PHP 소켓 프로그래밍에서 쉽게 간과되는 디버깅 도구입니다. 합리적으로 사용하면 디버그 정확도와 로그 신뢰성이 특히 높은 동시 연결 또는 복잡한 비 차단 통신 논리를 다룰 때 크게 향상 될 수 있습니다. 개발자는 키 소켓 작업 전에이 기능을 호출하는 습관을 개발하여보다 명확하고 신뢰할 수있는 디버깅 시스템을 구축해야합니다.