PHP 네트워크 프로그래밍에서 소켓은 개발자가 클라이언트와 서버 간의 데이터 교환을보다 유연하게 제어 할 수있는 기본 통신 방법입니다. 그러나 기본 특성으로 인해 프로그래머는 리소스 및 오류 처리 자체를 관리해야합니다. 이 기사에서는 일반적이지만 쉽게 간과되는 문제에 대해 설명합니다. Socket_clear_error ()를 호출 한 후 소켓을 다시 시작하는 것을 잊어 버린 결과.
Socket_clear_error () 는 마지막 소켓 작업에서 기록 된 오류 상태를 지우기 위해 PHP가 제공하는 함수입니다. 일반적으로 Socket_last_error () 와 함께 사용되며 마지막 소켓 작동의 오류 코드를 얻는 데 사용됩니다.
사용법은 다음과 같습니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "창조가 실패했습니다: " . socket_strerror(socket_last_error()) . PHP_EOL;
socket_clear_error();
}
이 기능의 원래 의도는 개발자가 여러 소켓 작업을 수행 할 때 이전 오류가 이전 작업에 의해 현재 오류인지 또는 남은지를 명확하게 알 수 있도록하는 것입니다.
많은 개발자들은 소켓 생성 또는 연결 고장을 겪은 후 오류 코드를 습관적으로 지우고이 소켓 객체를 사용하여 다시 연결하거나 데이터 전송과 같은 다음 작업을 수행합니다. 그러나이 관행은 소켓이 재 구선되지 않으면 일련의 문제를 일으킬 수 있습니다.
다음 예를 고려하십시오.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "만들다 socket 실패하다: " . socket_strerror(socket_last_error()) . PHP_EOL;
socket_clear_error();
}
// 다시 시작하는 것을 잊었습니다 socket
$result = socket_connect($socket, "m66.net", 80);
if ($result === false) {
echo "连接실패하다: " . socket_strerror(socket_last_error()) . PHP_EOL;
}
이 시나리오에서는 socket_create ()가 생성하지 못하면 false가 반환되고 다음 socket_connect ()는 유효하지 않은 리소스에서 작동하는 것입니다. 이로 인해 성공할뿐만 아니라 PHP가 경고를 던지거나 중단 프로그램 실행을 일으킬 수도 있습니다.
socket_connect () , socket_send () 또는 기타 소켓 함수를 호출 할 때, 들어오는 것이 허위 또는 손상된 소켓 인 경우 심각한 런타임 오류가 발생합니다.
오류 코드를 지우지 만 기본 문제를 수정하지 않으면 (즉, 소켓이 유효하지 않음) 후속 오류 메시지가 혼란스러워집니다. 개발자는 문제를 해결할 때 오류의 실제 원인을 무시할 수 있습니다.
다중 소켓 작업이 동시에있는 환경에서는 잘못 초기화 된 소켓이 I/O 프로세스에 참여하여 데이터가 예상대로 전송되지 않아야하며 비즈니스 로직도 오류가 발생할 수 있습니다.
오류 코드를 지우려면 socket_clear_error ()를 호출 한 후 소켓을 재 구선 해야하는지 확인해야합니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
echo "창조가 실패했습니다: " . socket_strerror(socket_last_error()) . PHP_EOL;
socket_clear_error();
// 重新만들다 socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("再次만들다 socket 실패하다: " . socket_strerror(socket_last_error()));
}
}
$result = socket_connect($socket, "m66.net", 80);
if ($result === false) {
echo "连接실패하다: " . socket_strerror(socket_last_error()) . PHP_EOL;
}
이는 후속 작업에서 유효하지 않거나 정의되지 않은 소켓을 사용하지 않습니다.
Socket_clear_error () 는 오류 처리의 정확도를 향상시키는 보조 도구이지만 소켓 자체를 수정하지는 않습니다. 실제 개발에서는 다음을 기억해야합니다. 소켓 생성이 실패하거나 실패하면 오래된 리소스를 계속 사용하는 대신 재현해야합니다 . 그렇지 않으면 커뮤니케이션 실패는 최소한이며 최악의 경우 전체 응용 프로그램의 논리로 이어지고 보안 위험을 유발할 수 있습니다.
우수한 오류 처리 및 자원 관리 습관을 개발 함으로써만 강력하고 신뢰할 수있는 PHP 네트워크 응용 프로그램을 작성할 수 있습니다.