PHP 네트워크 프로그래밍에서 Socket_set_blocking ()은 소켓이 차단 방식으로 실행되는지 여부를 제어하는 핵심 기능입니다. 행동을 이해하고 디버깅 기술을 마스터하는 것은 안정적이고 안정적인 네트워크 응용 프로그램을 개발하는 데 중요합니다. 이 기사에서는 Socket_set_Blocking () 의 차단 동작을 디버깅하는 방법에 대해 깊이 설명하고 실용적인 팁과 자세한 단계를 제공합니다.
PHP 소켓 함수를 사용하는 경우 차단과 비 블로킹의 차이는 다음과 같습니다.
차단 모드 : socket_read () 및 socket_accept () 와 같은 함수가 호출되면 데이터가 읽을 수 있거나 연결 요청이있을 때까지 프로세스가 중단됩니다.
비 블로킹 모드 : 이러한 함수를 호출 할 때 데이터가 없거나 연결 요청이 없으면 함수가 즉시 반환되고 일반적으로 False를 반환하고 Socket_Last_Error ()를 해당 오류 코드로 설정합니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, 'gitbox.net', 80);
// 차단 모드로 설정합니다
socket_set_blocking($socket, true);
이 시점에서 Socket_read () 호출을 실행하면 데이터가 돌아올 때까지 대기합니다.
비 차단으로 설정하려면 :
socket_set_blocking($socket, false);
비 블로킹으로 설정하면 socket_select ()를 사용하여 읽을 수있는/쓸 수 있는지 여부를 감지 할 수 있습니다.
$read = [$socket];
$write = $except = null;
$changed = socket_select($read, $write, $except, 5); // 타임 아웃 5 두번째
if ($changed > 0) {
$data = socket_read($socket, 1024);
echo "수신 데이터: $data\n";
} else {
echo "等待타임 아웃,未수신 데이터\n";
}
이 방법은 또한 차단 동작을 디버깅하는 데 적합합니다. 차단 모드에서 Socket_select ()는 차단이 예상대로 진행되는지 여부를 결정하는 데 도움이 될 수 있습니다.
모든 시나리오가 적용되는 것은 아니지만 Stream_Socket_Client ()는 유사한 제어 방법을 제공하고 타임 아웃을 설정하여 디버깅에 도움이됩니다.
$fp = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
stream_set_blocking($fp, true);
// 또는 사용 stream_set_blocking($fp, false); 블로킹이 아닌 것으로 설정됩니다
다른 설정에서 두 가지의 응답 동작을 비교함으로써 문제를 효과적으로 찾을 수 있습니다.
차단 동작을 디버깅 할 때 도킹 된 서버가 너무 빨리 응답하면 효과를 관찰하기가 어려울 수 있습니다. 임시 서버 (예 : Python 또는 PHP 사용)를 구축하고 지연을 추가하여 차단이 효과적임을 확인할 수 있습니다.
예를 들어, 서버 측 코드는 의도적으로 지연됩니다.
$client = socket_accept($serverSocket);
sleep(10); // 시뮬레이션 차단
socket_write($client, "Hello after delay");
클라이언트는이 기간을 차단 모드에서 기다려야하며 즉시 블로킹되지 않은 상태로 돌아갑니다.
socket_last_error () 및 socket_strerror ()를 사용하면 차단 문제를보다 명확하게 찾을 수 있습니다.
if ($data === false) {
$error = socket_last_error($socket);
echo "오류 코드: $error,설명하다: " . socket_strerror($error);
}
Eagain , ewouldBlock 등과 같은 일반적인 오류는 비 블로킹 모드에서 읽을 때 읽을 데이터가 없음을 나타냅니다.
차단 상태 시퀀스를 잘못 설정 : 연결 전에 차단 설정은 연결 후 설정만큼 좋지 않으면 효과가 다를 수 있으며 디버깅 중에 순서가 명확해야합니다.
socket_select ()의 타임 아웃 매개 변수 누락 : 기본값은 차단하고 대기하는 것입니다. 디버깅 중에 타임 아웃이 설정되지 않으면 소켓이 고정되었다고 잘못 생각합니다.
처리되지 않은 반환 값 : 차단 동작을 디버깅 할 때 반환 값을 무시하면 함수가 차단되었는지 여부를 결정할 수 없습니다.
Socket_set_Blocking () 의 차단 동작을 이해하고 올바르게 디버깅하는 것은 PHP 소켓 프로그래밍 마스터링의 중요한 부분입니다. Socket_select () , 로깅 및 시뮬레이션 테스트를 합리적으로 사용하면 네트워크 프로그램의 실행 흐름을 효과적으로 제어하고 시스템의 견고성 및 응답 효율을 향상시킬 수 있습니다. 이 기사에 제공된 팁과 단계가 실제 개발에보다 편리 해지는 데 도움이되기를 바랍니다.