현재 위치: > 최신 기사 목록> socket_set_block과 socket_set_nonblock 사이를 올바르게 전환하는 방법

socket_set_block과 socket_set_nonblock 사이를 올바르게 전환하는 방법

gitbox 2025-05-29

php를 사용하여 네트워크를 프로그래밍 할 때 Socket_set_block ()socket_set_nonblock () 은 소켓이 차단 또는 비 블로킹 모드에서 작동하는지 여부를 제어하는 ​​두 가지 매우 중요한 기능입니다. 이 두 모드를 합리적으로 전환하면 네트워크 I/O를보다 유연하게 처리하고 프로그램 효율성과 대응 성을 향상시키는 데 도움이됩니다.

차단 및 비 블로킹 모드의 차이

차단 모드 (기본값) :이 모드에서는 소켓 작동 (예 : Socket_read () , Socket_Accept () 등)가 데이터를 읽을 수 있거나 연결이 완료 될 때까지 대기합니다. 이 방법은 쓰기가 간단하지만 동시성이 높은 시나리오에서는 스레드 또는 프로세스 막힘이 발생하여 전반적인 성능을 줄일 수 있습니다.

비 블로킹 모드 : 반대로 비 블로킹 모드의 소켓 작동이 즉시 반환됩니다. 작업을 즉시 완료 할 수없는 경우 (읽을 데이터가없는 경우) 함수는 False를 반환하고 ERGAIN 또는 EWOULDBLOCK 으로 오류 코드를 설정합니다.

올바르게 사용하도록 전환하는 방법은 무엇입니까?

다음은 차단 상태와 비 블로킹 상태 사이를 전환하고 응용 프로그램 시나리오와 함께 사용하는 방법을 보여주는 간단한 예입니다.

 <?php
$host = 'gitbox.net';
$port = 8080;

$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("socket_create() failed: " . socket_strerror(socket_last_error()));
}

// 비 블로킹 모드로 설정합니다,연결하려고 노력하십시오
socket_set_nonblock($socket);

$connected = @socket_connect($socket, $host, $port);
if (!$connected) {
    $err = socket_last_error($socket);
    if ($err !== SOCKET_EINPROGRESS && $err !== SOCKET_EALREADY) {
        die("socket_connect() failed: " . socket_strerror($err));
    }
}

// 사용 select 연결이 성공했는지 확인하십시오
$write = [$socket];
$null = [];
if (socket_select($null, $write, $null, 5) > 0) {
    // 차단 모드로 다시 전환하십시오,후속 데이터 전송 및 수신에 사용됩니다
    socket_set_block($socket);

    // 데이터 보내기 및 수신을 시작하십시오
    socket_write($socket, "GET / HTTP/1.1\r\nHost: $host\r\n\r\n");
    $response = socket_read($socket, 2048);
    echo "Response: " . $response;
} else {
    die("Connection timeout or failed");
}

socket_close($socket);
?>

설명하다:

  1. 비 블로킹 연결 : Socket_Set_NonBlock ()을 사용하여 연결 작동이 프로그램 실행 차단을 방지하지 못합니다.

  2. Socket_select ()를 사용하여 소켓이 쓸 수있을 때까지 기다립니다 . 이는 연결이 성공적인지 여부를 감지하는 일반적인 트릭입니다.

  3. 차단 모드로 다시 전환하십시오 : Socket_set_Block ()을 사용하여 연결이 설정된 직후에 차단 모드로 다시 전환하여 후속 데이터 상호 작용을 용이하게합니다.

  4. 요청 및 읽기 응답 보내기 : 현재 소켓은 차단 모드에서 작동하여 전체 서버 응답을 읽을 수 있습니다.

언제 모드를 전환해야합니까?

  • 다중 연결 요청이 신속하게 시작 해야하는 경우 비 차단 모드 사용;

  • 시간 초과 제어와 같이 특정 작업이 무한히 대기하지 않도록해야합니다.

  • 연결 또는 특정 단계를 완료 한 후 블록 모드로 다시 전환하여 코드 처리 로직을 단순화하십시오.

주목해야 할 것

  • 비 블로킹 모드에서 모든 소켓 작업은 오류 확인을 받아야합니다.

  • socket_select () 는 비 차단 소켓 프로그래밍의 핵심 도구입니다.

  • 스위칭 모드는 정적이 아닌 작동 단계에 따라 수행해야합니다.

PHP 소켓 프로그래밍은 차단 및 비 블로킹 모드를 합리적으로 전환함으로써 성능과 안정성을 고려할뿐만 아니라 복잡한 네트워크 통신 요구에 더 잘 대응할 수 있습니다.