동시 요청이 높은 요청을 처리 할 때 PHP는 서버 측 스크립팅 언어로서 종종 요청 차단 문제에 직면해야합니다 (특히 네트워크 요청, 파일 읽기 및 쓰기 등). Socket_set_Blocking 기능은 PHP에서 개발자가 소켓의 차단 동작을 효과적으로 제어하여 동시 요청의 처리 능력을 향상시키는 데 도움이되는 유용한 도구입니다. 이 기사에서는 Socket_set_Blocking 함수를 사용하여 PHP의 동시 요청 처리를 최적화하는 방법을 소개합니다.
socket_set_blocking은 소켓이 차단 모드인지 제어하는 데 사용되는 기능입니다. 기본적으로 소켓은 차단 모드에서 실행됩니다. 즉 소켓 작동 (예 : 읽기 또는 쓰기 데이터)에 데이터가 없을 때 프로그램이 데이터를 사용할 수있을 때까지 기다릴 수 있습니다. 소켓을 비 블로킹 모드로 설정함으로써 프로그램은 특정 I/O 작업이 완료되기를 기다리는 대신 다른 작업을 계속 수행 할 수 있습니다.
bool socket_set_blocking ( resource $socket , bool $blocking )
$ 소켓 : 설정 해야하는 소켓 리소스.
$ Blocking : True 인 경우 소켓을 차단 모드로 설정하십시오. False 인 경우 소켓을 비 블로킹 모드로 설정하십시오.
전통적인 차단 패턴은 많은 동시 요청을 처리 할 때 시스템 성능 병목 현상으로 이어질 수 있습니다. 소켓을 비 블로킹 모드로 설정함으로써 PHP 스크립트는 소켓 작동을 기다리는 동안 다른 요청을 계속 처리 할 수 있습니다. 다음은 Socket_set_blocking을 통해 효율적인 동시 요청 처리를 달성하는 방법입니다.
여러 클라이언트 요청을 처리해야한다고 가정하고 각 요청을 처리 할 때 차단을 피하려고한다고 가정하면 간단한 예제 코드는 다음과 같습니다.
<?php
// 만들다TCP socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
// 묶다socket
socket_bind($socket, '127.0.0.1', 8080);
// 모니터링을 시작하십시오
socket_listen($socket);
// 비 블로킹 모드로 설정합니다
socket_set_blocking($socket, false);
while (true) {
// 클라이언트 연결을받습니다
$client = socket_accept($socket);
// 연결이없는 경우 다른 작업을 계속 수행하십시오.
if ($client === false) {
// 예를 들어, 다른 작업을 확인하거나 로깅 작업을 수행하십시오.
echo "클라이언트 연결이 없습니다,다른 작업에 대해 계속 작업하십시오...\n";
continue;
}
// 클라이언트를 비 블로킹으로 설정하십시오
socket_set_blocking($client, false);
// 클라이언트 데이터를 읽습니다
$input = socket_read($client, 1024);
if ($input) {
echo "클라이언트 데이터를 받았습니다: $input\n";
// 요청을 처리하고 응답하십시오
socket_write($client, "HTTP/1.1 200 OK\r\nContent-Type: text/plain\r\n\r\nHello, Client!");
}
// 연결을 닫으십시오
socket_close($client);
}
socket_close($socket);
?>
위의 코드에서는 Socket_set_Blocking ($ socket, false) 으로 서버 측 소켓을 비 블로킹 모드로 설정합니다. 즉, 클라이언트 요청이 없으면 Socket_Accept는 차단되지 않고 대기하지 않지만 False를 반환합니다. 이를 통해 프로그램은 Socket_Accept 에 머무르지 않고 클라이언트 연결없이 다른 작업을 계속 수행 할 수 있습니다.
마찬가지로 각 클라이언트 연결을 처리 할 때 클라이언트 소켓을 블로킹 모드로 설정하여 데이터를 읽을 때 전체 프로그램이 고정되지 않고 동시 요청의 처리 능력을 향상시킬 수 있습니다.
높은 동시성 시나리오에서 비 블로킹 소켓 작업을 통해 Socket_Select 또는 멀티 스레드/다중 프로세스 방법을 사용하여 여러 동시 요청을보다 효율적으로 처리 할 수 있습니다. Socket_select 는 다중 소켓 리소스를 모니터링 할 수있는 매우 유용한 기능으로, 읽을 수있는 소켓 만 처리되어 불필요한 차단을 피할 수 있습니다.
<?php
// 만들다主socket
$masterSocket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($masterSocket, SOL_SOCKET, SO_REUSEADDR, 1);
socket_bind($masterSocket, '127.0.0.1', 8080);
socket_listen($masterSocket);
// 비 블로킹을 설정하십시오
socket_set_blocking($masterSocket, false);
$clients = array($masterSocket);
while (true) {
// 사용socket_select모니터링을 수행하십시오
$read = $clients;
$write = null;
$except = null;
// 감시 장치socket
if (socket_select($read, $write, $except, null) > 0) {
// 모든 데이터를 통해 반복하십시오socket
foreach ($read as $socket) {
if ($socket === $masterSocket) {
// 새로운 연결을 수락하십시오
$client = socket_accept($masterSocket);
socket_set_blocking($client, false);
$clients[] = $client;
} else {
// 클라이언트 데이터를 읽습니다
$input = socket_read($socket, 1024);
if ($input === false) {
// 연결을 끊습니다
socket_close($socket);
$clients = array_diff($clients, array($socket));
} else {
echo "수신 된 데이터: $input\n";
socket_write($socket, "Hello, Client!");
}
}
}
}
}
socket_close($masterSocket);
?>
이 예에서 Socket_select 함수는 다중 소켓 연결을 동시에 모니터링하는 데 사용됩니다. 소켓을 사용할 수 있으면 프로그램이 데이터를 읽고 처리합니다. 이러한 방식으로 서버는 한 요청으로 인해 다른 요청의 처리를 차단하지 않고도 여러 동시 요청을 동시에 처리 할 수 있습니다.
Socket_set_Blocking 함수를 사용하여 소켓을 비 블로킹 모드로 설정하는 것은 PHP 동시 요청 처리의 효율을 향상시키는 중요한 수단입니다. 차단 모드를 합리적으로 구성하고 Socket_Select 기능을 사용하여 개발자는 PHP에서 효율적인 동시 요청 처리를 달성하여 기존 차단 모드로 인한 성능 병목 현상을 피할 수 있습니다. I/O 운영 최적화는 많은 동시 연결을 처리 해야하는 응용 프로그램의 성능을 향상시키는 데 중요합니다.