현재 위치: > 최신 기사 목록> 연결 초기화 단계에서 상태 흐름을 제어하려면 socket_set_block을 사용하십시오.

연결 초기화 단계에서 상태 흐름을 제어하려면 socket_set_block을 사용하십시오.

gitbox 2025-05-29

Socket_set_block ()은 PHP를 사용하여 저수준 네트워크를 프로그래밍 할 때 중요하지만 종종 간과되는 기능입니다. 소켓이 차단 모드인지 여부를 제어하여 연결 초기화 단계에서 소켓의 동작에 영향을 미칩니다. 이 기사는 예제와 원칙을 사용하여 socket_set_block ()을 사용하여 상태의 상태 흐름을 제어하고 기능을 분석하는 방법을 설명합니다.

차단 및 비 블로킹 모드 개요

네트워크 통신에서 "차단"은 소켓 작동 (예 : Connect 또는 Read )을 즉시 완료 할 수 없을 때 프로그램이 실행을 일시 중지하고 작동이 완료되기를 기다립니다. "비 블로킹"은 이러한 작업이 즉시 반환되고 프로그램이 다른 논리를 계속 실행할 수 있음을 의미합니다.

PHP에서 소켓은 기본적으로 차단 모드입니다. 즉, socket_connect ()를 호출하고 원격 서버가 응답하지 않으면 스크립트가 연결이 성공적이거나 시간이 초과 될 때까지 대기합니다.

socket_set_block () 사용

socket_set_block () 은 PHP가 소켓을 차단 모드로 설정하기 위해 제공하는 함수입니다. 해당 비 블로킹 함수는 socket_set_nonblock () 입니다. 연결 초기화 프로세스를 제어 할 때이 두 기능을 결합하면보다 유연한 연결 관리 로직을 달성 할 수 있습니다.

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
    die("만들 수 없습니다socket: " . socket_strerror(socket_last_error()));
}

// 연결 프로세스를 제어하기 위해 비 블로킹 모드로 설정하십시오
socket_set_nonblock($socket);

$host = 'gitbox.net';
$port = 80;
$time_start = time();
$timeout = 5;

// 연결하려고 노력하십시오
@socket_connect($socket, $host, $port);

// 차단 모드로 전환하십시오,맞잡다 select 연결이 완료 될 때까지 기다리십시오
socket_set_block($socket);

// 사용 select 연결 결과를 기다립니다
$write = [$socket];
$except = [$socket];
$read = null;
$tv_sec = $timeout;
$tv_usec = 0;

$select_result = socket_select($read, $write, $except, $tv_sec, $tv_usec);
if ($select_result > 0 && in_array($socket, $write)) {
    echo "연결이 성공적으로 연결됩니다\n";
} else {
    echo "연결이 실패하거나 시간이 초과되었습니다\n";
}

socket_close($socket);

연결 상태 흐름 제어의 중요성

  1. 기본 스레드 차단을 피하십시오 . 일부 응용 프로그램 시나리오에서 (예 : 이벤트 중심의 비동기 서버 또는 동시에 여러 연결을 시도 해야하는 클라이언트) 단일 소켓이 전체 프로세스를 차단할 수는 없습니다. 연결 전에 차단을 설정하고 수동으로 차단 모드로 전환하면 "비동기 연결 + 동기화 작업"의 조합을 달성 할 수 있습니다.

  2. 사용자 정의 시간 초과 메커니즘 : Socket_connect () 의 차단 시간은 운영 체제의 기본 시간 초과에 의해 제어되지만, 비 블로킹 및 socket_select ()를 통해 연결 대기 시간을 정확하게 제어하여 서버 응답이 느리기 때문에 사용자 경험의 저하를 피할 수 있습니다.

  3. 보다 복잡한 상태 흐름 관리 : 스테이트 머신 및 작업 스케줄러와 같은 고급 네트워크 모델을 구현할 때 소켓 상태를 수동으로 제어하는 ​​것이 기본 기능입니다. socket_set_block ()을 사용하면 "시도 시도"가 아닌 "응답 확인"이 어떤 작업을 명확하게 구별 할 수 있습니다.

Stream_Socket_Client와 비교합니다

PHP는 차단 또는 비 블로킹 설정을 지원하는 더 높은 수준의 Stream_Socket_client ()를 제공하지만, 기본 소켓 작동은 연결 상태의 세분화 된 제어가 필요한 시나리오에 더 적합합니다. 예를 들어, 동시성 연결 테스트 도구, 맞춤형 HTTP 클라이언트 및 구축 소켓 기반 프로토콜 에뮬레이터도 있습니다.

결론

socket_set_block ()은 단순한 상태 스위칭 기능 인 것처럼 보이지만 연결 초기화 단계에서 PHP 소켓 통신에 높은 수준의 제어 성과 확장 성을 가져옵니다. 사용을 마스터하면 더 강력하고 유연한 네트워크 커뮤니케이션 프로그램을 개발하는 데 도움이 될 것입니다. 특히 동시성, 비동기식 또는 사용자 정의 프로토콜이있는 시나리오에서 필수 불가결 한 시나리오에서는 더욱 그렇습니다.