PHP 네트워크 프로그래밍에서 비 블로킹 소켓은 종종 프로그램 응답 속도 및 동시성을 향상시키는 데 사용됩니다. 소켓을 비 블로킹 모드로 설정하면 데이터 대기로 인해 프로그램이 차단되지 않으므로 더 많은 작업이 동시에 처리 될 수 있습니다. 그러나 비 블로킹 패턴은 또한 약간의 추가 복잡성을 가져 오며 오류 처리는 특히 중요합니다. 이 기사는 비 블로킹 소켓에서 Socket_clear_error () 함수를 올바르게 사용하는 방법과 사용할 때주의를 기울여야하는 문제에 중점을 둡니다.
Socket_clear_error () 는 소켓에서 발생한 오류를 지우는 PHP의 함수입니다. 소켓 오류 상태가 후속 작업에 영향을 미치지 않도록하기 위해 예외 처리 및 오류 복구 시나리오에서 종종 사용됩니다.
비 차단 소켓 작동을 수행 할 때는 현재 사용 가능한 데이터가 없거나 리소스를 사용할 수없는 경우 대기 대신 즉시 반환됩니다. 이 동작은 종종 Eagain 또는 EwouldBlock 과 같은 특정 "오류"상태로 이어지는데, 이는 실제로 실제 오류가 아니라 단순히 리소스를 일시적으로 사용할 수 없음을 의미합니다. 이 경우 오류를 직접보고하거나 연결을 닫지 않아야하지만 다음에 사용할 수있게됩니다.
처리 된 오류 정리 <br> 소켓 오류 코드가 감지되면 오류가 올바르게 처리 된 것으로 판단되면 (예 : eagain이 처리되고 재시도 대기), Socket_clear_Error ()가 호출되어 오류 상태를 재설정하여 후속 작업에 영향을 미치지 않도록 오류 상태를 재설정해야합니다.
오류없이 전화하지 마십시오 <br> 오류가 감지되지 않고 Socket_Clear_Error ()를 자주 호출하는 것이 좋습니다. 그렇지 않으면 실제 오류 정보가 마스크되어 문제를 해결하기가 어려울 수 있습니다.
socket_last_error () <br>와 함께 사용하십시오 일반적으로 socket_last_error ()는 소켓의 현재 오차 상태를 결정하는 데 사용됩니다. socket_clear_error ()는 실제로 오류가있는 경우에만 호출됩니다.
<?php
// 비 블로킹을 만듭니다 Socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
// 서버에 연결하십시오
socket_connect($socket, 'm66.net', 80);
// 비 블로킹 보내기 데이터
$data = "GET / HTTP/1.1\r\nHost: m66.net\r\nConnection: Close\r\n\r\n";
$bytesSent = socket_write($socket, $data);
if ($bytesSent === false) {
$errCode = socket_last_error($socket);
if ($errCode == SOCKET_EAGAIN || $errCode == SOCKET_EWOULDBLOCK) {
// 자원을 일시적으로 사용할 수 없습니다,나중에 다시 시도하십시오
echo "Write would block, try again later.\n";
} else {
// 다른 오류,출력 오류 메시지 및 명확한 오류 상태
echo "Socket write error: " . socket_strerror($errCode) . "\n";
socket_clear_error($socket);
}
}
// 응답을 읽으십시오
while (true) {
$buffer = socket_read($socket, 2048);
if ($buffer === false) {
$errCode = socket_last_error($socket);
if ($errCode == SOCKET_EAGAIN || $errCode == SOCKET_EWOULDBLOCK) {
// 데이터를 일시적으로 사용할 수 없습니다,계속 기다리십시오
usleep(100000); // 100ms
continue;
} else {
echo "Socket read error: " . socket_strerror($errCode) . "\n";
socket_clear_error($socket);
break;
}
} elseif ($buffer === '') {
// 연결이 닫힙니다
break;
} else {
echo $buffer;
}
}
socket_close($socket);
?>
차별화 오류 유형 : 비 차단 모드에서 Eagain 또는 EwouldBlock 오류는 정상이며 연결 고장 또는 예외 처리로 취급 될 수 없습니다.
오류를 자주 지우지 마십시오 . 오류 상태는 올바르게 처리되었음을 확인한 후에 만 오류 상태가 지워져야하며 블라인드 콜은 실제 문제를 다룰 것입니다.
상태를 모니터링하기 위해 다른 기능과 결합하여 Socket_last_error ()는 오류를보다 안전하게 관리하기 위해 Socket_clear_error () 와 함께 사용됩니다.
시간 초과 및 재 시정 논리를 잘 처리하십시오 : 비 차단 작업은 종종 회복 간격과 횟수를 합리적으로 설계하기 위해 폴링 또는 이벤트 메커니즘과의 협력이 필요합니다.