현재 위치: > 최신 기사 목록> socket_set_block 동기 모델과 비동기 역할을합니다

socket_set_block 동기 모델과 비동기 역할을합니다

gitbox 2025-05-26

PHP 네트워크 프로그래밍에서 소켓 작업의 차단 및 비 블로킹 상태는 프로그램의 실행 프로세스 및 성능에 직접적인 영향을 미칩니다. 특히 비동기 모델이 동기 모델에 사용되는 시나리오에서는 Socket_set_block () 함수가 특히 중요합니다. 이 기사는이 기능 주변의 비동기식과 동기식 모델의 특정 역할 및 응용 프로그램 예제를 분석합니다.


1. 차단 및 비 블로킹 모드 소개

소켓 통신을위한 두 가지 기본 작업 모드가 있습니다.

  • 차단 모드 : 읽기, 쓰기 및 기타 작업이 수행되면 데이터가 준비되지 않으면 기능이 작업이 완료 될 때까지 프로그램을 차단합니다. 이 모드는 프로그램이 간단하지만 동시성 환경에서 성능 병목 현상을 쉽게 유발할 수 있습니다.

  • 비 블로킹 모드 : 작업이 즉시 반환됩니다. 데이터가 준비되지 않은 경우 오류 또는 특정 상태 코드가 반환됩니다. 이 프로그램은 비동기 이벤트 중심 모델에 적합한 다른 작업을 계속 수행 할 수 있습니다.

PHP 에서이 두 상태는 socket_set_block ()socket_set_nonblock () 을 통해 전환 할 수 있습니다.


2. 동기 모델에 대한 비동기의 배경

비동기 모델 에서이 프로그램은 작업이 완료 될 때까지 기다리지 않고 이벤트 루프 또는 콜백 메커니즘을 통해 데이터를 처리하여 리소스를 효율적으로 활용할 수 있지만 프로그래밍 복잡성을 증가시킵니다. 여러 번 프로그램 논리를 단순화하기 위해 개발자는 비동기 동작을 특정 단계에서 동기 실행으로 "인위적으로"변환하므로 차단 메커니즘을 통해 결과를 기다려야합니다.

현재 socket_set_block ()은 핵심 역할을합니다.


3. 동기화에 대한 비동기식에서 socket_set_block ()의 ​​역할

소켓이 비 차단 (비동기)이라고 가정합니다. 즉, 읽기 및 쓰기 작업을 호출 할 때 데이터를 기다리지 않고 즉시 반환됩니다. 작업을 동기로 실행하려면 "차단 및 대기"를 원하시면 Socket_set_Block ()을 호출해야합니다.

 socket_set_block($socket);

이렇게하면 소켓을 차단 모드로 전환하고 후속 읽기 및 쓰기 호출은 작업이 완료되거나 시간이 초과 될 때까지 기다립니다. 이런 식으로, 귀하의 프로그램은 "동시 실행"인 것으로 보이며 비동기에서 동기로 전환을 실현합니다.

특정 기능에는 다음이 포함됩니다.

  • 데이터가 준비 될 때까지 프로그램을 일시 중지합니다 . 예를 들어, Socket_read () 호출은 데이터가 수신 될 때까지 차단되어 "빈 읽기"를 방지합니다.

  • 제어 프로세스 단순화 : 이벤트 루프 또는 콜백이 필요하지 않으므로 순차적 논리 코드를 쉽게 작성할 수 있습니다.

  • 동기 상호 작용 보장 : 확인 단계가 완료된 시나리오 (예 : 핸드 셰이크, 인증).


4. 코드 예제

다음은 간단한 TCP 클라이언트를 보여줍니다. 먼저 비 차단 연결을 설정하고 차단 모드로 전환하여 서버 응답을 읽고 비동기 연결 동기 데이터 읽기의 변환을 인식하십시오.

 <?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);

$host = 'gitbox.net';
$port = 8080;

// 비동기 연결 시도
@socket_connect($socket, $host, $port);

// 연결이 완료 될 때까지 기다리십시오(개략도,더 엄격하게 처리해야합니다)
$write = [$socket];
$except = null;
$read = null;
if (socket_select($read, $write, $except, 5) > 0) {
    // 차단 모드로 전환하십시오,동기 읽기를 준비하십시오
    socket_set_block($socket);

    // 데이터를 동시에 읽으십시오
    $data = socket_read($socket, 2048);
    echo "Received: " . $data;
} else {
    echo "Connection timeout or failed.";
}

socket_close($socket);
?>

여기에서 socket_set_block ()은 socket_read ()가 서버가 비어있는 읽기를 피하기 위해 데이터를 보낼 때까지 기다릴 수 있도록합니다.


5. 요약

동기화 모델에서 비동기식에서 Socket_set_block () 은 주로 소켓의 작동 모드를 전환하고 비 블로킹 비동기 호출을 동기 호출 차단으로 변환하는 데 사용됩니다. 개발자가 네트워크 상호 작용 로직을 단순화하는 데 도움이됩니다. 특히 결과를 기다려야 할 때 특정 단계에서 유용 할 때 특히 그렇습니다.

그러나 차단 모드는 프로그램의 실행을 일시 중지하여 성능과 응답 성에 영향을 줄 수 있습니다. 따라서 네트워크 응용 프로그램을 설계 할 때는 특정 요구에 따라 차단 또는 비 블로킹 모델을 합리적으로 선택해야합니다.