PHP에서 네트워크를 프로그래밍 할 때 소켓 프로그래밍은 공통적이고 기본 통신 방법입니다. 읽기 차단이 필요한 시나리오의 경우 Socket_set_Block 및 Socket_Read 기능은 효율적이고 안정적인 데이터 수신을 달성하는 데 합리적으로 사용됩니다. 이 기사에서는이 두 기능을 예제와 함께 자세히 사용하는 기술을 소개합니다.
차단 모드 : 읽기 기능을 호출 할 때 데이터가 준비되지 않은 경우 프로그램이 차단하고 데이터를 읽을 수 있거나 시간 초과 될 때까지 대기합니다.
비 블로킹 모드 : 읽기 기능이 즉시 반환됩니다. 데이터를 읽을 수없는 경우 비어 있거나 오류가 반환되며 프로그램은 다른 작업을 계속 수행 할 수 있습니다.
기본적으로 PHP 소켓은 차단 모드에 있으며, 이는 HTTP 요청 처리, 채팅 애플리케이션 등과 같이 데이터가 전체에 도착할 때까지 기다려야하는 응용 프로그램에 적합합니다.
socket_set_block (Resource $ 소켓) : bool
소켓을 차단 모드로 설정하십시오. 이 기능을 호출 한 후에는 후속 Socket_read가 데이터를 읽을 수있을 때까지 차단됩니다.
socket_read (Resource $ socket, int $ length, int $ type = php_binary_read) : String | false
소켓에서 데이터를 읽습니다. 차단 모드에 있고 데이터가없는 경우 데이터가 도착할 때까지 기다리십시오. 차단이 없으면 즉시 돌아옵니다.
차단 모드를 설정하십시오 <br> 읽기 중에 지속적으로 폴링 할 때 CPU 낭비를 피하기 위해 소켓이 Socket_set_block ($ socket) 을 통해 차단되어 있는지 확인하십시오.
읽기 길이를 합리적으로 지정하십시오
Socket_read의 두 번째 인수는 매번 읽는 최대 바이트 수를 지정합니다. 너무 작 으면 전화가 자주 발생하며 너무 커지면 대기 시간이 길어질 수 있습니다.
종말을위한 처리 조건 <br> 일반적으로 읽기를 차단하려면 특정 결말 문자를 읽거나 죽은 루프를 피하기 위해 지정된 길이를 읽는 것과 같은 출구 조건이 필요합니다.
오류 및 시간 초과 처리 <br> 차단 모드는 대기하지만 실제 응용 프로그램에서 시간 초과를 설정하여 영구 차단을 방지해야합니다. PHP 소켓 자체에는 직접 타임 아웃 매개 변수가 없지만 Socket_Select 로 구현할 수 있습니다.
<?php
// 만들다 TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
// 서버에 연결하십시오,도메인 이름을 대체하십시오 gitbox.net
$host = "gitbox.net";
$port = 80;
if (!socket_connect($socket, $host, $port)) {
die("socket_connect failed: " . socket_strerror(socket_last_error($socket)));
}
// 차단 모드를 설정하십시오
socket_set_block($socket);
// 보내기 간단합니다 HTTP 요청 예제
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// 응답 데이터를 읽습니다
$response = '';
while (true) {
// 가장 많이 읽는 것은입니다1024바이트
$buf = socket_read($socket, 1024, PHP_BINARY_READ);
if ($buf === false) {
echo "socket_read failed: " . socket_strerror(socket_last_error($socket));
break;
}
if ($buf === '') {
// 독서가 끝납니다
break;
}
$response .= $buf;
}
// 출력 서버 응답
echo $response;
// 폐쇄 socket
socket_close($socket);
?>
Socket_set_Block을 사용하여 차단 모드를 설정 한 후 Socket_read는 CPU 사용량이 높지 않아 데이터가 도착할 때까지 차단됩니다.
효율적이고 안전한 데이터 수신을 보장하기 위해 읽기 중에 읽기 길이 및 루프 출구 조건을 합리적으로 설정해야합니다.
Socket_Select 와 결합하여 프로그램 견고성을 향상시키기 위해 타임 아웃으로 읽기를 차단할 수 있습니다.
위의 예는 HTTP 요청을 예제로 사용하여 차단 모드에서 전체 응답을 부드럽게 읽는 방법을 보여줍니다.
Socket_set_block 및 Socket_read 와 합리적으로 협력함으로써 PHP 소켓 판독 값은보다 효율적이고 안정적으로 만들어 질 수 있으며, 데이터를 차단하고 기다려야하는 다양한 네트워크 응용 프로그램에 적합합니다.