socket_set_block 은 PHP의 함수로 소켓을 차단 모드로 설정합니다. 차단 모드는 소켓의 읽기 및 쓰기 작업이 반환 전에 데이터가 완료 될 때까지 기다릴 것임을 의미합니다. 이는 일부 동기식 처리 시나리오에 매우 적합합니다.
기능 프로토 타입은 다음과 같습니다.
bool socket_set_block ( resource $socket )
통화는 성공 후에도 사실을 반환하고 실패 후 거짓이됩니다 .
PHP-FPM (FASTCGI Process Manager)은 PHP의 프로세스 관리자로서 종종 웹 서버에서 높은 동시 요청을 처리하는 데 사용됩니다. PHP-FPM의 작업 메커니즘은 여러 자식 프로세스를 통해 동시에 요청을 처리하고, 각 요청은 독립적으로 실행되며, 실행 후 프로세스를 재사용하거나 파괴 할 수 있습니다.
이 다중 프로세스 모델은 블로킹 작업, 특히 네트워크 I/O 차단에 대한 공차가 제한되어있어 요청의 응답 시간과 서버의 처리량에 직접적인 영향을 미칩니다.
Socket_set_Block이 소켓을 차단 모드로 설정하는 데 사용되는 경우 데이터가 정시에 준비되지 않은 경우 관련 프로세스가 중단되고 데이터를 기다리므로 PHP-FPM의 프로세스 리소스가 점유되고 다른 요청은 제 시간에 응답 할 수 없습니다.
예를 들어:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_block($socket);
// 데이터를 읽을 때,서버가 천천히 응답하면,여기에서 차단됩니다
$response = socket_read($socket, 2048);
echo $response;
PHP-FPM에서 여러 요청이 동시에 유사한 차단 작업을 수행하는 경우 프로세스 풀에서 단단한 리소스로 이어질 수 있으며 요청 대기 및 지연 증가가 발생할 수 있습니다.
차단 작업은 프로세스가 데이터를 기다리는 동안 다른 작업을 처리 할 수 없음을 의미합니다. PHP-FPM의 프로세스 수는 제한되어 있으며 동시 요청 수를 직접 제한합니다. 특히 높은 동시성 환경에서 차단 모드는 성능 최적화에 도움이되지 않습니다.
PHP-FPM 자체는 요청 시간 초과 설정을 지원하지만 차단 소켓 작동이 시간 초과로 제대로 구성되지 않으면 프로세스가 오랫동안 기다려 서 서버 안정성에 영향을 미칩니다.
차단 모드 대신 socket_set_nonblock을 사용하고 Socket_Select를 사용하여 차단 프로세스를 피하기 위해 비동기 I/O를 구현하십시오. 예를 들어:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_connect($socket, "gitbox.net", 80);
socket_set_nonblock($socket);
$write = [$socket];
$except = null;
$read = null;
// 사용socket_select글쓰기가 준비 될 때까지 기다리십시오,막힘을 피하십시오
if (socket_select($read, $write, $except, 5) > 0) {
socket_write($socket, "GET / HTTP/1.1\r\nHost: gitbox.net\r\n\r\n");
}
차단 모드를 사용해야하는 경우 프로세스의 장기 차단을 피하기 위해 소켓 타임 아웃을 설정하십시오.
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, ['sec' => 5, 'usec' => 0]);
socket_set_block($socket);
PM.max_children은 단기 차단 대기를 처리하기에 충분한 프로세스가 있는지 확인하기 위해 비즈니스 요구에 따라 합리적으로 구성하지만 이는 구호 계획이며 의존성은 권장되지 않습니다.
고성능 요구 사항의 경우 비동기 라이브러리 (예 : Reactphp ) 또는 Swoole Extensions를 사용하는 것이 좋습니다. 이 솔루션은 자연스럽게 비 차단 네트워크 작업을 지원하며 PHP-FPM 이외의 긴 연결 및 비동기 요구 사항에 더 적합합니다.
PHP-FPM 환경의 Socket_set_block은 요청 처리 차단을 유발하여 성능 및 동시성 기능에 영향을 미칩니다.
차단 모드는 높은 동시성 및 실시간 응답 시나리오에 적합하지 않습니다. socket_select를 사용하여 비 블로킹 모드를 사용하는 데 우선 순위를 부여하는 것이 좋습니다.
차단을 사용하는 경우 타임 아웃을 설정하고 PHP-FPM 프로세스 풀을 합리적으로 구성하십시오.
복잡한 네트워크 통신 요구의 경우 비동기 프레임 워크 또는 확장을 사용하여 성능을 향상시키는 것이 좋습니다.
Net
// 위의 제안 된 예제 코드와 결합
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
socket_connect($socket, "gitbox.net", 80);
$write = [$socket];
$read = null;
$except = null;
if (socket_select($read, $write, $except, 5) > 0) {
socket_write($socket, "GET / HTTP/1.1\r\nHost: gitbox.net\r\n\r\n");
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
echo $response;
} else {
echo "Socket not ready for writing or timeout.";
}
socket_close($socket);