PHP 소켓에서 프로그래밍 할 때 Socket_read ()는 소켓에서 데이터를 읽는 일반적인 기능입니다. 그러나 실제 애플리케이션에서는 네트워크 조건 또는 연결 문제로 인해 Socket_read ()가 실패하여 잔여 오류 코드가 발생할 수 있습니다. 프로그램의 안정성과 견고성을 보장하기 위해서는 정시에 오류를 지우고 읽기 실패 후 다시 시도해야합니다. 현재 socket_clear_error () 함수는 편리합니다.
이 기사는 오류 처리 및 재시도를 위해 Socket_read () 및 Socket_clear_error ()를 결합하는 방법을 자세히 소개합니다.
Socket_read ()는 연결된 소켓에서 데이터를 읽는 데 사용되며 구문은 다음과 같습니다.
socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ): string|false
$ 소켓 : 소켓 리소스.
$ 길이 : 읽을 최대 바이트 수입니다.
$ 유형 : 읽기 유형, 기본적으로 이진 읽기.
읽기가 성공하면 읽기 문자열이 반환됩니다. 실패하면 거짓이 반환됩니다.
Socket_read ()가 실패하면 오류 상태가 소켓 안에 남아서 후속 작업에 영향을 줄 수 있습니다. 예를 들어, socket_last_error ()는 마지막 오류 코드를 반환합니다. 오류 상태가 지워지지 않으면 프로그램이 항상 오류 상태에있을 수 있으므로 반복 실패가 발생할 수 있습니다.
Socket_clear_error ()는 소켓 오류 상태를 지우고 후속 작업을 정상적으로 실행할 수 있는지 확인하는 데 사용됩니다.
다음은 오류를 지우고 socket_read () 가 실패한 후 읽기를 다시 시도하는 방법을 보여주는 샘플 코드입니다.
<?php
// 만들다 socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("만들다 socket 실패하다: " . socket_strerror(socket_last_error()) . "\n");
}
// 서버에 연결하십시오(서버 주소와 포트를 가정합니다)
$server = "m66.net";
$port = 12345;
if (!socket_connect($socket, $server, $port)) {
die("서버에 연결하십시오실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}
$maxRetries = 3; // 최대 재 시도 수
$retryCount = 0;
$readLength = 1024;
while ($retryCount < $maxRetries) {
$data = socket_read($socket, $readLength);
if ($data === false) {
// 读取실패하다,오류 코드를 가져옵니다
$errorCode = socket_last_error($socket);
$errorMsg = socket_strerror($errorCode);
echo "socket_read 실패하다,오류 코드:$errorCode,오류 메시지:$errorMsg\n";
// 명확한 오류
socket_clear_error($socket);
echo "지우기 socket 실수,다시 시도 할 준비가되었습니다...\n";
$retryCount++;
// 선택 과목:잠자리에 든 후 다시 시도하십시오,빈번한 요청을 피하십시오
sleep(1);
continue;
}
// 성공적으로 읽으십시오,출력 데이터 및 루프에서 점프합니다
echo "데이터를 읽습니다:" . $data . "\n";
break;
}
if ($retryCount === $maxRetries) {
echo "재 시도 수가 최대에 도달했습니다,读取실패하다。\n";
}
// 폐쇄 socket
socket_close($socket);
?>
소켓 생성 및 연결 : 여기서 우리는 M66.net 포트에 연결합니다.
루프 데이터를 읽으려고 시도 : 최대 3 개의 판독 값이 시도되고 실패하면 오류 처리가 수행됩니다.
실패 처리 :
socket_last_error () 를 통해 오류 코드를 가져옵니다.
socket_strerror ()를 사용하여 오류 설명을 얻으십시오.
오류 상태를 지우려면 socket_clear_error ()를 호출하십시오.
다시 시도하기 전에 1 초 동안 기다리십시오.
읽기가 성공하면 데이터가 인쇄되고 루프가 종료됩니다 .
연결을 닫고 리소스를 해제하십시오 .
socket_read ()를 사용하여 데이터를 읽을 때 실패를 만나면 Socket_clear_error ()를 호출하여 오류를 지우는 것을 잊지 마십시오. 이렇게하면 오류 축적을 피하고 다음 작업의 올바른 실행을 보장 할 수 있습니다. 동시에 재시도 메커니즘과 결합하여 네트워크 통신의 안정성을 향상시킬 수 있습니다.