PHP의 네트워크를 프로그래밍 할 때 소켓 확장은 개발자에게 바닥의 네트워크 연결을 제어 할 수있는 기능을 제공합니다. 그 중에서도 Socket_set_Block 및 Socket_read는 동기식 판독 값을 구현하는 핵심 기능입니다. 목표가 소켓 바이트 바이트에서 데이터를 읽는 것이라면 일부 사용자 정의 프로토콜 또는 스트리밍 데이터 처리 메커니즘을 구현하는 파서와 같은 파서와 같은이 두 기능의 사용을 이해하는 것이 특히 중요합니다.
이 기사는 Socket_set_Block 함수를 사용하여 소켓을 차단 모드로 설정하고 Socket_read 와 협력하여 한 번에 하나의 바이트를 읽는 방식으로 수신 된 데이터를 점차적으로 처리하는 방법을 자세히 설명합니다.
PHP 소켓 프로그래밍에서 소켓이 차단되거나 차단되지 않을 수 있습니다. 차단 모드에서 Socket_read 와 같은 함수를 호출 할 때 데이터를 읽을 수없는 경우 데이터가 도착할 때까지 프로그램이 "차단"됩니다. 이 패턴은 데이터가 순차적으로 처리되고 바이트에 의한 읽기 메커니즘의 구현을 용이하게하는 시나리오에 적합합니다.
소켓을 차단 모드로 설정하려면 다음 기능을 사용할 수 있습니다.
socket_set_block($socket);
기본적으로 새로 생성 된 소켓이 차단되고 있지만 일관된 동작을 보장하기 위해서는 읽기 전에 Socket_set_Block을 명시 적으로 호출하는 것이 좋습니다.
Socket_read는 소켓에서 데이터를 읽는 PHP의 함수입니다. 프로토 타입은 다음과 같습니다.
socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ): string|false
안에:
$ 소켓은 연결된 연결이있는 소켓 리소스입니다.
$ 길이는 읽을 바이트 수를 나타냅니다.
$ 유형은 일반적으로 php_binary_read 와 함께 사용하여 이진 안전 방식으로 읽기를 표현합니다.
데이터 바이트 바이트를 읽으려면 $ 길이를 1 로 설정할 수 있습니다.
$byte = socket_read($socket, 1);
차단 모드에서 함수는 하나 이상의 바이트를 읽을 때까지 대기 한 다음 반환됩니다.
다음은 원격 서버에 연결하고 (예제로 gitbox.net을 취하는) 간단한 예입니다. Newline이 발생할 때까지 바이트 바이트에 의해 응답 데이터를 읽습니다.
<?php
$host = 'gitbox.net';
$port = 80;
// 만들다 socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() 실패하다: " . socket_strerror(socket_last_error()) . "\n");
}
// 원격 호스트에 연결하십시오
if (!socket_connect($socket, $host, $port)) {
die("socket_connect() 실패하다: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 차단 모드로 설정합니다
socket_set_block($socket);
// 간단하게 보내십시오 HTTP 묻다
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// 응답 바이트를 읽으십시오,Newline 캐릭터가 발생할 때까지
$response = '';
while (true) {
$byte = socket_read($socket, 1);
if ($byte === false || $byte === '') {
break;
}
$response .= $byte;
if ($byte === "\n") {
break;
}
}
// 응답의 첫 번째 줄을 출력하십시오
echo "첫 번째 줄에 대한 응답:\n" . $response;
// 연결을 닫으십시오
socket_close($socket);
?>
성능 영향 : 바이트 바이트 판독 값은 더 많은 시스템 호출을 가져 오므로 데이터 양이 클 때 성능이 영향을받을 수 있습니다. 새로운 패턴 (예 : Newline까지)을 읽으려면 먼저 합리적인 읽기 길이를 설정 한 다음 strpos ()를 사용하여 더 효율적인 Newline 위치를 찾을 수 있습니다.
문자 인코딩 문제 : Socket_read는 원래 이진 데이터를 반환하므로 처리하기 전에 특히 텍스트 프로토콜을 처리 할 때 데이터를 인코딩하는 방법을 이해해야합니다.
연결 시간 초과 : 차단 모드에서 서버가 오랫동안 응답하지 않으면 프로그램 이 socket_read 에서 중지됩니다. socket_set_option 과 함께 읽기 시간 초과를 설정하는 것을 고려하십시오.
Socket_set_block을 통해 소켓을 차단 모드로 설정 한 후 Socket_read를 사용하여 한 번에 One Byte를 읽으면 정제 된 데이터 제어를 달성 할 수 있으며, 이는 문자 프로토콜을 기반으로 구문 분석 로직을 구축하는 데 적합합니다. 이 방법은 일부 고성능 시나리오에서 충분히 효율적이지는 않지만 안정적이고 제어 가능한 데이터 스트림 처리가 필요할 때 여전히 매우 실용적인 방법입니다.
이 기술을 사용하면 Custom Protocol Parsing, 문자 별 명령 인식 등과 같은 PHP에서보다 복잡한 네트워크 상호 작용 로직을 구현하여 서버 측 통신에서 PHP의 기능을 확장 할 수 있습니다.