PHP에서는 네트워크 통신을 처리 할 때 차단 및 비 블로킹 모드의 제어가 매우 중요합니다. socket_set_block 및 stream_set_blocking 은 일반적으로 사용되는 두 가지 기능입니다. 둘 다 소켓이나 스트림의 차단 동작을 설정하는 데 사용되지만 해당 객체 및 사용법에는 약간의 차이가 있습니다. 이 기사에서는이 두 기능과 사용 방법의 차이점을 자세히 소개합니다.
차단 모드 : 기능 호출은 데이터를 읽을 때까지 데이터 읽기, 전송이 완료 될 때까지 데이터 쓰기와 같은 작업이 완료 될 때까지 대기 하며이 시간 동안 프로그램이 일시 중지 및 대기합니다.
비 블로킹 모드 : 기능 호출은 작동이 완료 될 때까지 기다리지 않습니다. 작업을 즉시 완료 할 수 없으면 즉시 반환되고 프로그램은 다른 작업을 계속 실행할 수 있습니다.
적용 가능 : PHP 소켓 확장의 소켓 리소스 ( Socket_create () 와 같은 기능을 통해 생성)
기능 : 소켓을 차단 모드로 설정하십시오.
기능 프로토 타입 :
bool socket_set_block(resource $socket)
반환 값 : 성공을 위해 True , 실패에 대해 False를 반환합니다.
적합한 : fopen () , stream_socket_client () 또는 socket_create ()로 변환 된 스트림 자원이 socket_import_stream () 에 의해 반환 된 자원과 같은 스트림 기반 리소스.
기능 : 흐름의 차단 모드를 설정하십시오.
기능 프로토 타입 :
bool stream_set_blocking(resource $stream, int $mode)
매개 변수 :
$ 스트림 : 스트리밍 리소스
$ 모드 : 1은 차단을 의미하며 0은 차단을 의미합니다
반환 값 : 성공을 위해 True , 실패에 대해 False를 반환합니다.
특성 | socket_set_block | stream_set_blocking |
---|---|---|
해당 리소스 | 소켓 확장의 소켓 리소스 | PHP 스트리밍 리소스 (파일 스트림, 네트워크 스트림 등) |
차단 모드 설정 방법 | 추가 매개 변수없이 직접 호출하십시오 | 두 번째 매개 변수 (0 또는 1)로 차단 모드를 지정합니다. |
사용 유연성 | 차단 만 설정할 수 있습니다. 소시 _set_nonblock () 이 비 블로킹에 필요합니다. | 차단 또는 비 블로킹을 설정할 수 있습니다 |
해당 시나리오 | 저수준 소켓 프로그래밍 | 고급 네트워크 흐름 프로그래밍 |
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
socket_set_block($socket); // 차단 모드로 설정합니다
// 서버에 연결하십시오
socket_connect($socket, "gitbox.net", 80);
// 요청을 보내십시오
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// 응답을 읽으십시오
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
echo $response;
socket_close($socket);
?>
<?php
$stream = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
if (!$stream) {
die("Connection failed: $errstr ($errno)");
}
// 차단 모드로 설정합니다
stream_set_blocking($stream, 1);
// 요청을 보내십시오
fwrite($stream, "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n");
// 응답을 읽으십시오
$response = '';
while (!feof($stream)) {
$response .= fread($stream, 2048);
}
echo $response;
fclose($stream);
?>
Socket_set_Block 은 PHP 소켓 확장의 소켓 자원에 특별히 사용되며 소켓을 차단 상태로 직접 설정합니다.
Stream_set_blocking은 더 넓은 범위의 스트림 리소스에 적합하며 차단 모드와 비 블로킹 모드간에 유연한 전환을 제공합니다.
선택할 기능은 주로 사용하는 리소스 유형에 따라 다릅니다. 소켓 확장을 사용하여 소켓을 관리하는 경우 Socket_set_block을 사용하십시오. 스트림 리소스 (예 : Stream_Socket_client )를 사용하는 경우 Stream_set_blocking을 사용하십시오.
이 두 기능과 그 차이를 이해하면 PHP 네트워크 프로그래밍에서 데이터 읽기 및 쓰기 동작을 더 잘 제어하고 프로그램 성능 및 응답을 최적화하는 데 도움이됩니다.