PHP에서 네트워크를 통신 할 때 종종 TCP 프로토콜을 통해 클라이언트와 서버 간의 연결을 설정해야합니다. 연결의 동작을 제어하기 위해 다른 소켓 옵션을 사용하여 비 블로킹 또는 차단 네트워크 통신을 달성 할 수 있습니다. socket_set_block 은 소켓을 차단 모드로 설정하는 데 도움이되는 매우 중요한 기능 중 하나입니다. 이는 특정 네트워크 통신 요구에 매우 유용합니다.
네트워크 프로그래밍에서 차단 및 비 블로킹 모드는 소켓 작업을 수행 할 때 프로그램의 동작을 결정합니다.
차단 모드 :이 모드에서 프로그램은 작업이 완료되기를 기다리고 (예 : 데이터 읽기 또는 쓰기) 작업이 성공하거나 오류가 발생할 때까지 계속 실행되지 않습니다. 즉, 읽을 데이터가 없으면 프로그램이 기다릴 것입니다.
비 블로킹 모드 :이 모드에서 프로그램은 작동이 완료되기를 기다리지 않습니다. 데이터를 일시적으로 사용할 수없는 경우 소켓 작업은 즉시 오류 또는 특정 상태 값을 반환하여 프로그램이 다른 작업을 계속 수행 할 수 있습니다.
socket_set_block 함수는 차단 모드로 생성 된 소켓을 설정하는 데 사용됩니다. 이것은 특정 네트워크 요청을 처리 할 때, 특히 프로그램이 정상적으로 데이터가 돌아올 때까지 대기 할 때 매우 유용합니다. socket_set_block 함수는 특정 차단 동작을 지정하기 위해 추가 매개 변수가 필요하지 않습니다. 하나의 호출을 통해 소켓을 차단 모드로만 설정합니다.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_set_block</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> );
</span></span>
$ 소켓 : 차단 모드로 설정할 소켓 리소스.
이 함수는 설정이 성공했음을 나타 내기 위해 true를 반환하고 설정이 실패했음을 나타 내기 위해 False를 반환합니다. 설정이 실패하면 Socket_Last_Error ()를 사용하여 특정 오류 정보를 얻을 수 있습니다.
다음은 Socket_set_Block을 사용하여 차단 모드에 대한 TCP 연결을 설정하는 방법을 보여주는 간단한 예입니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 만들다 TCP 소켓</span></span><span>
</span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_create</span></span><span>(AF_INET, SOCK_STREAM, SOL_TCP);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$socket</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Socket 만들다失败: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 대상 서버에 연결합니다</span></span><span>
</span><span><span class="hljs-variable">$address</span></span><span> = </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>;
</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-number">8080</span></span><span>;
</span><span><span class="hljs-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_connect</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$address</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$result</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"연결이 실패했습니다: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-title function_ invoke__">socket_last_error</span></span><span>()) . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 将소켓设置为阻塞模式</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">socket_set_block</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>)) {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"소켓已成功设置为阻塞模式。\n"</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"设置소켓为阻塞模式失败。\n"</span></span><span>;
</span><span><span class="hljs-keyword">exit</span></span><span>;
}
</span><span><span class="hljs-comment">// 데이터를 보냅니다</span></span><span>
</span><span><span class="hljs-variable">$message</span></span><span> = </span><span><span class="hljs-string">"Hello, Server!"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_write</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-variable">$message</span></span><span>, </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$message</span></span><span>));
</span><span><span class="hljs-comment">// 응답을 받으십시오</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"서버 응답: <span class="hljs-subst">$response</span></span></span><span>\n";
</span><span><span class="hljs-comment">// 关闭소켓</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
이 예에서는 먼저 TCP 소켓을 생성하고 socket_connect를 통해 서버에 연결합니다 (IP가 127.0.0.1 이고 포트는 8080 이라고 가정). 그런 다음 socket_set_block을 사용하여 소켓을 차단 모드로 설정 한 다음 메시지를 보내어 서버의 응답을 기다립니다.
차단 모드의 영향 :
차단 모드에서는 Socket_read 또는 Socket_write 와 같은 작업이 완료되거나 시간이 초과 될 때까지 현재 프로세스를 차단합니다. 따라서 반응이없는 연결을 오랫동안 처리 할 때 프로그램이 응답하지 않을 수 있습니다.
서버 측 응답 속도를 제어 할 수 있도록해야합니다. 그렇지 않으면 차단 모드는 대기 시간이 높은 네트워크 환경에서 심각한 성능 병목 현상을 초래할 수 있습니다.
비 블로킹 모드로 전환 :
소켓을 비 블로킹 모드 ( Socket_set_nonBlock 함수를 통해)로 설정 한 경우 Socket_set_Block을 사용하여 다시 차단 모드로 전환 할 수 있습니다. 그러나 스위칭 모드는 기존 연결 동작에 영향을 줄 수 있습니다.
오류 처리 :
socket_set_block을 사용하는 경우 기능의 반환 값을 확인하는 데주의를 기울여야합니다. 설정이 실패하면 Socket_last_error를 사용하여 특정 오류 코드를 얻고 그에 따라 해당 측정 값을 사용할 수 있습니다.
해당 시나리오 :
차단 모드는 일반적으로 클라이언트 요청-서버 응답의 기존 네트워크 모델과 같이 순서 및 무결성이 필요한 데이터 전송 시나리오에 적합합니다. 이 모드에서 클라이언트는 다음 작업을 수행하기 전에 서버가 데이터를 반환 할 때까지 기다립니다.
Socket_set_block 은 PHP의 간단하고 효율적인 기능으로 소켓을 차단 모드로 설정하여 프로그램이 소켓 작업을 수행하는 동안 작동을 완료 할 때까지 기다립니다. 이는 특정 네트워크 통신 시나리오, 특히 서버가 응답 및 처리를 기다려야하는 시나리오에 매우 유용합니다. 실제로 사용하면 개발자는 네트워크 통신의 효율성과 안정성을 보장하기 위해 자체 요구에 따라 차단 또는 비 블로킹 모드를 선택해야합니다.