고도로 사용 가능한 네트워크 서비스를 구축 할 때 PHP가 제공하는 소켓 기능은 개발자에게 강력한 기본 제어 기능을 제공합니다. socket_set_block () 은 소켓을 차단 모드로 설정하는 중요한 기능 중 하나입니다. 따라서 데이터를 읽거나 쓸 때 프로그램의 대기 동작을 제어합니다. 합리적인 시간 초과 메커니즘으로 강력하고 고도로 사용 가능한 연결 관리 솔루션을 구축 할 수 있습니다.
PHP 소켓으로 프로그래밍 할 때는 차단 및 비 블로킹 모드의 동작에 필수적인 차이가 있습니다.
차단 모드 : 읽기 또는 쓰기 작업 중에 데이터 나 연결을 사용할 수없는 경우 조건이 충족되거나 오류가 발생할 때까지 프로그램이 "대기"됩니다.
비 블로킹 모드 : 작업이 즉시 돌아오고 대기하지 않습니다. 이를 위해서는 개발자가 연결 상태, 데이터 준비 등과 같은 세부 사항을 관리해야합니다.
socket_set_block () 의 함수는 소켓을 차단 모드로 명시 적으로 설정하여 socket_read () 또는 socket_write ()를 호출 할 때 작업이 완료되도록하는 것입니다.
고 가용성 연결 메커니즘에는 다음과 같은 특성이 있어야합니다.
연결이 제 시간에 도달 할 수 있는지 여부를 감지 할 수 있습니다.
막힘으로 인해 프로그램의 장기 교수형을 피하십시오.
서버 또는 네트워크 문제의 경우 빠르게 전환하거나 다시 시도하십시오.
합리적인 리소스 릴리스 및 예외 처리.
현재 타임 아웃 설정과 결합 된 차단 모드가 특히 중요합니다. php는 socket_set_option () 함수를 제공하여 시간 초과 시간을 설정합니다.
다음은 일반적인 구현 로직이며 단계는 다음과 같습니다.
소켓을 만듭니다.
시간 초과 시간을 설정하십시오.
차단 모드로 설정;
연결하려고;
연결 상태를 확인하십시오.
정상적인 읽기 및 쓰기 또는 시간 초과 처리.
샘플 코드는 다음과 같습니다.
<?php
$host = 'gitbox.net';
$port = 80;
// 만들다 socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()));
}
// 연결 시간 초과 시간을 설정하십시오(초)
$timeout = ['sec' => 5, 'usec' => 0];
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, $timeout);
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, $timeout);
// 차단 모드로 설정합니다
socket_set_block($socket);
// 연결을 시작하십시오
$result = @socket_connect($socket, $host, $port);
if ($result === false) {
$errorCode = socket_last_error($socket);
$errorMsg = socket_strerror($errorCode);
echo "연결이 실패했습니다: [$errorCode] $errorMsg\n";
socket_close($socket);
exit;
}
// 성공적인 연결 후에 요청을 보내십시오
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// 응답을 읽으십시오
$response = '';
while ($chunk = socket_read($socket, 2048)) {
$response .= $chunk;
}
echo "서버 응답:\n$response";
socket_close($socket);
?>
socket_set_option ()은 읽기 및 보내는 시간 초과 시간을 구성합니다. 대상 호스트가 응답하지 않으면 무기한 차단되지 않습니다.
socket_set_block ()은 읽기 및 쓰기 작업이 순차적 논리를 준수하고 잦은 폴링이 필요하지 않도록합니다.
네트워크 문제가 가장 일반적인 예외 소스이기 때문에 오류 처리는 각 단계, 특히 socket_connect ()를 따라야합니다.
이 방법은 다음을 포함하여 대부분의 TCP 네트워크 요청에 적용됩니다.
HTTP 인터페이스 하트 비트 감지;
인트라넷 서비스 상태 모니터링;
분포 된 노드 간 건강 검사;
간단한 부하 밸런싱 사전 감지.
그것의 장점은 단순하게 달성하고 명확한 제어를 가지고 있으며 추가 확장에 의존하지 않는다는 것입니다. 스크립트 자동화 작업 또는 가벼운 서비스에 적합합니다.
적절한 시간 초과 메커니즘과 함께 socket_set_block ()을 사용하면 네트워크 연결을 처리 할 때 PHP가 더 탄력적이고 결함이 발생할 수 있습니다. 특히 신뢰도가 높은 환경에서는 행동 차단 및 시간 초과 전략의 합리적인 제어는 고도로 가용 시스템을 구축하는 데 없어서는 안될 부분입니다. 위의 코드 및 아이디어를 통해 실제 요구에 따라보다 완전한 연결 풀, 재 시도 메커니즘 또는 서비스 모니터링 시스템을 구축 할 수 있습니다.