PHP와 함께 소켓을 프로그래밍 할 때 개발자는 Socket_set_block () 또는 Socket_set_nonBlock () 과 같은 문제가 작동하지 않는 것처럼 보이고 소켓 동작이 기대치와 일치하지 않습니다. 이 상황에는 여러 가지 이유가있을 수 있습니다. 이 기사는이 기능이 "유효하지 않은"일반적인 이유를 탐색하고 해당 문제 해결 제안을 제공합니다.
먼저 socket_set_block ()을 호출하기 전에 socket_create ()가 유효한 소켓 자원을 반환해야합니다. 매개 변수 오류, 시스템 리소스 또는 권한이 부족하여 소켓 생성이 실패하면 소켓의 후속 작업이 자연스럽게 적용되지 않습니다.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("Socket 창조가 실패했습니다: " . socket_strerror(socket_last_error()));
}
socket_set_block($socket);
오류 감지가 무시되지 않도록하는 것은 그러한 문제를 해결하는 첫 번째 단계입니다.
경우에 따라 소켓 리소스가 닫혀 있거나 socket_set_block () 이 호출 될 때 유효하지 않은 상태 일 수 있습니다. 예를 들어, 원격 호스트가 연결을 닫은 후에 차단 설정 기능을 호출하면 영향을 미치지 않습니다.
Socket_get_status ()를 사용하거나 연결 상태를 모니터링하여 잘못된 상태에서 차단 모드를 설정하지 않도록 할 수 있습니다.
PHP에서는 Stream_Socket_Client () 와 같은 함수가 종종 리소스를 만드는 데 사용됩니다. 기본 소켓 리소스가 아닌 스트림을 반환합니다. 이 경우 Socket_set_block ()을 사용하여 차단 모드를 제어 할 수는 없지만 Stream_set_blocking ()을 사용해야합니다.
$stream = stream_socket_client("tcp://gitbox.net:80", $errno, $errstr, 30);
if (!$stream) {
die("연결이 실패했습니다: $errstr ($errno)");
}
stream_set_blocking($stream, true); // 올바른 차단 설정 방법
다양한 유형의 리소스와 기능을 혼합하는 것은 설정 장애가있는 일반적인 이유 중 하나입니다.
일부 시스템 구현에서는 Socket_connect () 호출이 완료되면 소켓 상태가 영향을받을 수 있으므로 Socket_set_block () 설정이 완전히 적용되지 않습니다. 특히 비 차단 연결 시나리오에서 (예 : 연결을 위해 블로킹을 위해 비 블로킹으로 설정하려면) 차단하도록 설정하려면 즉시 적용되지 않을 수 있습니다.
socket_connect ()을 호출하기 전에 차단/비 블로킹 설정이 완료되거나 연결 설정 로직을 재평가하는 것이 좋습니다.
일부 시스템은 소켓 차단 동작, 특히 특정 제한된 컨테이너, SELINUX 설정 또는 Open_Basedir 제한과 같은 안전한 환경에서 특수 처리가있어 일부 소켓 설정 동작을 방지 할 수 있습니다. socket_last_error () 와 로그 모니터링을 사용하면 이러한 문제를 확인하는 데 도움이 될 수 있습니다.
멀티 스레드 확장 (예 : pthreads) 또는 코 루틴 프레임 워크 (예 : Swoole)를 사용할 때 유효하지 않은 차단 설정에 직면하면 프레임 워크가 기본 I/O 모델을 캡슐화하고 기본 Socket_set_block ()을 적용 할 수 없습니다. 현재 프레임 워크에서 제공하는 I/O 제어 방법을 참조하십시오.
예를 들어, PHP 기본 소켓 함수 대신 $ socket-> setblocking (true)을 사용하는 것이 좋습니다.