현재 위치: > 최신 기사 목록> socket_set_block은 socket_select와 함께 사용하여 차단하고 대기합니다

socket_set_block은 socket_select와 함께 사용하여 차단하고 대기합니다

gitbox 2025-05-28

차단 및 비 블로킹의 기초

PHP 소켓은 기본적으로 차단 모드입니다. 즉, 데이터 나 리소스가 준비되지 않은 경우 읽기 또는 쓰기를 시도 할 때까지 통화가 기다립니다. 차단 모드 대신 통화가 즉시 돌아옵니다.

Socket_set_block ($ socket)을 사용하여 소켓을 차단 모드로 설정 한 다음 Socket_Select를 결합하여 데이터가 도착할 때까지 기다립니다.


socket_select 란 무엇입니까?

Socket_select 는 여러 소켓을 읽거나 쓸 수 있거나 예외 상태가있는 다중 기능입니다. 기본 구조는 다음과 같습니다.

 socket_select(array &$read, array &$write, array &$except, int $tv_sec, int $tv_usec)
  • $ 읽기 : "읽기 가능한"상태를 기다리는 소켓 어레이

  • $ 쓰기 : "쓰기 가능한"상태를 기다리는 소켓 어레이

  • $ : "예외"상태를 기다리는 소켓 어레이

  • $ TV_SEC / $ TV_USEC : 초 시간 초과 시간 및 마이크로 초


실제 데모 : 클라이언트 연결 차단 및 대기

다음은 socket_select 와 함께 socket_set_block을 사용하여 클라이언트 연결 대기를 차단하는 TCP 기반 서버 예제입니다.

 <?php
// 만들다 TCP 소켓
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);

// 주소 재사용을 설정하십시오
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);

// 묶다 IP 그리고 포트
socket_bind($socket, '0.0.0.0', 8080);

// 모니터링을 시작하십시오
socket_listen($socket);

// 차단 모드로 설정합니다
socket_set_block($socket);

echo "Server started on gitbox.net:8080\n";

// 메인 루프
while (true) {
    // 청취 배열을 초기화하십시오
    $read = [$socket];
    $write = $except = [];

    // 사용 socket_select 차단 및 대기
    $changed_sockets = socket_select($read, $write, $except, 0, 0);

    if ($changed_sockets === false) {
        echo "socket_select failed: " . socket_strerror(socket_last_error()) . "\n";
        break;
    }

    // 메인이라면 socket 읽을 수 있습니다,새로운 연결 요청이 있음을 나타냅니다
    if (in_array($socket, $read)) {
        $client = socket_accept($socket);
        if ($client !== false) {
            echo "New client connected\n";

            // 고객에게 메시지를 보냅니다
            $msg = "Welcome to gitbox.net server!\n";
            socket_write($client, $msg, strlen($msg));

            // 클라이언트 연결을 닫습니다
            socket_close($client);
        }
    }
}

// 메인을 닫으십시오 socket
socket_close($socket);
?>

키 포인트 설명

  1. 행동 차단 : socket_set_block 이 사용되므로 Socket_Accept는 연결 요청이 없을 때 차단하고 대기합니다. Socket_Select 와 결합하여 스레드 공회전을 피할 수 있습니다.

  2. Flexible Timeout Control : Socket_Select 의 시간 초과 매개 변수는 블로킹 시간을 제어하는 ​​데 사용할 수 있으며, 이는 폴링 또는 심장 박동 메커니즘이 필요한 일부 서비스에서 매우 유용합니다.

  3. 멀티 클라이언트 지원 : $ 읽기 배열에 여러 개의 소켓을 추가하여 Socket_Select는 여러 연결을 효과적으로 지원하여 고소성 서버를보다 쉽게 ​​구축 할 수 있습니다.