현재 위치: > 최신 기사 목록> PHP에서 socket_set_blocking 함수를 사용하여 동시 요청을 효율적으로 처리하는 방법은 무엇입니까?

PHP에서 socket_set_blocking 함수를 사용하여 동시 요청을 효율적으로 처리하는 방법은 무엇입니까?

gitbox 2025-06-09

동시 요청이 높은 요청을 처리 할 때 PHP는 서버 측 스크립팅 언어로서 종종 요청 차단 문제에 직면해야합니다 (특히 네트워크 요청, 파일 읽기 및 쓰기 등). Socket_set_Blocking 기능은 PHP에서 개발자가 소켓의 차단 동작을 효과적으로 제어하여 동시 요청의 처리 능력을 향상시키는 데 도움이되는 유용한 도구입니다. 이 기사에서는 Socket_set_Blocking 함수를 사용하여 PHP의 동시 요청 처리를 최적화하는 방법을 소개합니다.

socket_set_blocking 함수의 개요

socket_set_blocking은 소켓이 차단 모드인지 제어하는 ​​데 사용되는 기능입니다. 기본적으로 소켓은 차단 모드에서 실행됩니다. 즉 소켓 작동 (예 : 읽기 또는 쓰기 데이터)에 데이터가 없을 때 프로그램이 데이터를 사용할 수있을 때까지 기다릴 수 있습니다. 소켓을 비 블로킹 모드로 설정함으로써 프로그램은 특정 I/O 작업이 완료되기를 기다리는 대신 다른 작업을 계속 수행 할 수 있습니다.

함수 정의 :

 bool socket_set_blocking ( resource $socket , bool $blocking )
  • $ 소켓 : 설정 해야하는 소켓 리소스.

  • $ Blocking : True 인 경우 소켓을 차단 모드로 설정하십시오. False 인 경우 소켓을 비 블로킹 모드로 설정하십시오.

동시성 성능을 향상시키기 위해 socket_set_blocking을 사용하는 방법

전통적인 차단 패턴은 많은 동시 요청을 처리 할 때 시스템 성능 병목 현상으로 이어질 수 있습니다. 소켓을 비 블로킹 모드로 설정함으로써 PHP 스크립트는 소켓 작동을 기다리는 동안 다른 요청을 계속 처리 할 수 ​​있습니다. 다음은 Socket_set_blocking을 통해 효율적인 동시 요청 처리를 달성하는 방법입니다.

1. 기본 코드 예제

여러 클라이언트 요청을 처리해야한다고 가정하고 각 요청을 처리 할 때 차단을 피하려고한다고 가정하면 간단한 예제 코드는 다음과 같습니다.

 <?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);
?>

2. 차단 모드를 이해하십시오

위의 코드에서는 Socket_set_Blocking ($ socket, false) 으로 서버 측 소켓을 비 블로킹 모드로 설정합니다. 즉, 클라이언트 요청이 없으면 Socket_Accept는 차단되지 않고 대기하지 않지만 False를 반환합니다. 이를 통해 프로그램은 Socket_Accept 에 머무르지 않고 클라이언트 연결없이 다른 작업을 계속 수행 할 수 있습니다.

마찬가지로 각 클라이언트 연결을 처리 할 때 클라이언트 소켓을 블로킹 모드로 설정하여 데이터를 읽을 때 전체 프로그램이 고정되지 않고 동시 요청의 처리 능력을 향상시킬 수 있습니다.

3. 동시 요청의 효율적인 처리를 구현합니다

높은 동시성 시나리오에서 비 블로킹 소켓 작업을 통해 Socket_Select 또는 멀티 스레드/다중 프로세스 방법을 사용하여 여러 동시 요청을보다 효율적으로 처리 할 수 ​​있습니다. 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 운영 최적화는 많은 동시 연결을 처리 해야하는 응용 프로그램의 성능을 향상시키는 데 중요합니다.