네트워크 프로그래밍에 PHP를 사용하는 경우 Socket_set_block () 함수는 종종 소켓을 차단 모드로 설정하는 데 사용됩니다. 그러나 PHP 자체는 크로스 플랫폼이지만 기본 시스템 호출 및 동작은 운영 체제 구현에 따라 달라 지므로 Windows 및 Linux 시스템에서 Socket_set_block () 의 성능에 미묘하거나 명백한 차이가 있습니다. 이 기사에서는 이러한 차이점을 심층적으로 탐색하고 실제 개발에서주의를 기울여야 할 몇 가지 핵심 사항을 지적합니다.
socket_set_block (Resource $ 소켓) : bool
이 기능은 주어진 소켓을 차단 모드로 설정하는 데 사용됩니다. 차단 모드에서 Socket_read () 또는 Socket_accept () 와 같은 함수를 호출 할 때 데이터를 읽을 수 없거나 연결이 허용되는 경우 작업이 계속 될 때까지 호출이 중단됩니다 (블록).
이것은 socket_set_nonblock () 과 반대이며, 이로 인해 이러한 작업이 차단되지 않게됩니다 (즉시 반환).
Windows : 소켓은 기본적으로 차단 모드입니다.
Linux : 마찬가지로, 소켓은 일반적으로 생성 될 때 차단됩니다.
이는 두 플랫폼에서 일관성이있을 수 있지만 Linux의 소켓은 일부 경우 (특정 라이브러리 또는 시스템 환경을 통한 구성) 비 블로킹 모드로 암시 적으로 설정 될 수 있습니다. 따라서 크로스 플랫폼 개발에서 socket_set_block ()을 명시 적으로 호출하는 것은 비교적 안전한 관행입니다.
차단 모드에서는 다른 플랫폼이 동작을 "반환"시기에 대해 약간 다른 판단을 가질 수 있습니다. 예를 들어:
Windows에서 Socket_read ()는 TCP 연결이 분리 된 후 버퍼가 지워 질 때까지 기다릴 수 있으며, 이는 연속 차단으로 나타납니다.
Linux에서는 분리가 일반적으로 socket_read ()가 더 빨리 거짓을 반환하도록 트리거합니다.
이로 인해 개발자는 Windows에서 논리를 테스트하게 될 수 있지만 Linux 배포 후 시간 초과 또는 리소스가 해제되지 않은 문제가 있습니다.
PHP는 통합 인터페이스를 제공하지만 기본 호출은 운영 체제의 API입니다.
Linux에서 Socket_set_block ()은 실제로 fcntl ()를 통해 O_nonBlock 플래그를 설정합니다.
Windows에서는 fionbio 플래그 비트를 제어하기 위해 ioctlSocket ()이 호출됩니다.
이는 오류 코드 및 오류 의미가 두 플랫폼에서 다르다는 것을 의미합니다. 개발자는 socket_last_error ()를 사용하여 특정 오류를 얻고 socket_strerror () 를 통해 사람이 읽을 수있는 오류 정보를 얻어야합니다.
샘플 코드 :
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die("socket_create failed: " . socket_strerror(socket_last_error()));
}
// 차단 모드로 설정합니다
if (!socket_set_block($socket)) {
die("Failed to set blocking mode: " . socket_strerror(socket_last_error($socket)));
}
// 원격 호스트에 연결하십시오
if (!socket_connect($socket, 'gitbox.net', 80)) {
die("socket_connect() failed: " . socket_strerror(socket_last_error($socket)));
}
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
$response = '';
while ($out = socket_read($socket, 2048)) {
$response .= $out;
}
echo $response;
socket_close($socket);
디스플레이 설정 모드 <br> 기본 동작에 대한 의존성이 없으며, 크로스 플랫폼 일관성을 향상시키기 위해 항상 차단 또는 비 블로킹 모드를 명시 적으로 설정하십시오.
오류 처리 브랜치 <br> 결함 내성 논리를 작성할 때 특정 플랫폼의 오류 코드에 의존하지 마십시오. socket_strorr () 에서 제공 한 정보를 사용하여 판단을 내리십시오.
테스트 환경 일관성 <br> 로컬 테스트 중에 사용 된 환경 (예 : WSL2, Docker)이 잠재적 인 행동 차이를 발견하기 위해 가능한 한 목표 배포 환경에 가깝습니다.
시간 초과 제어 제안 <br> 차단 모드의 작동 소켓은 교착 상태 나 지연을 쉽게 유발할 수 있습니다. socket_set_option () 로 합리적인 시간 초과를 설정하거나 Stream_Socket_Client () 및 시간 초과를 지원하는 기타 캡슐화 기능을 사용하는 것이 좋습니다.
PHP는 우리를 위해 시스템의 기본 복잡성을 대부분 차단하지만 네트워크 프로그래밍의 시스템 플랫폼 차이에주의를 기울여야합니다. socket_set_block () 함수는 간단하지만 Windows 및 Linux 시스템의 성능 차이는 프로그램의 안정성과 이식성에 영향을 줄 수 있습니다. 행동과 세심한 테스트를 명확하게하는 것이 프로그램이 원활하게 실행되도록하는 열쇠입니다.