socket_set_blocking () 함수는 소켓이 차단 모드인지 여부를 설정하는 데 사용됩니다. 차단 모드에서 소켓의 읽기 및 쓰기 작업은 데이터가 준비 될 때까지 기다립니다. 차단 모드 대신 데이터가없는 경우 데이터가 도착하기를 기다리는 대신 작업이 즉시 반환됩니다. 이는 여러 클라이언트 연결을 처리 해야하는 서버에 특히 중요하며 비 차단 모드는 하나의 연결 차단으로 인해 전체 프로그램이 매달리지 못하게 할 수 있습니다.
<span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_set_blocking</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> , </span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-variable">$blocking</span></span><span> )
</span></span>$ 소켓 : 소켓 리소스.
$ 차단 : 사실 이라면 소켓이 차단 모드에 있습니다. False 인 경우 소켓은 비 블로킹 모드입니다.
예를 들어 소켓을 비 차단 모드로 설정하십시오.
<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-title function_ invoke__">socket_set_blocking</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>socket_get_status () 함수는 차단 모드인지, 소켓이 닫혀 있는지 여부 등을 포함하여 현재 소켓의 상태 정보를 얻는 데 사용됩니다. 다음 필드를 포함하는 연관 배열을 반환합니다.
차단 : 차단 모드에 있든 1은 차단을 의미하며 0은 차단을 의미합니다.
EOF : 파일 엔드 플래그에 도달했는지 여부 (연결이 닫힌 경우).
오류 : 현재 소켓의 오류 코드.
ERRORSTR : 현재 소켓의 오류 메시지.
<span><span><span class="hljs-keyword">array</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span> ( resource </span><span><span class="hljs-variable">$socket</span></span><span> )
</span></span>예를 들어 소켓 상태를 가져옵니다.
<span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</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">"Blocked: "</span></span><span> . </span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'blocked'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"EOF: "</span></span><span> . </span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>] . </span><span><span class="hljs-string">"\n"</span></span><span>;
</span></span>socket_set_blocking () 과 socket_get_status ()를 결합하면 특히 동시 연결을 처리 할 때보다 유연하고 효율적인 네트워크 통신을 달성 할 수 있습니다. 사용시 몇 가지 팁과 예방 조치는 다음과 같습니다.
경우에 따라 소켓의 차단 모드를 동적으로 전환해야합니다. 예를 들어, 네트워크 요청을 처리 할 때, 소켓 판독 데이터가 차단 모드에 있으면 네트워크가 상태가 양호하지 않거나 데이터가 준비되지 않은 경우 전체 프로그램이 중단 될 수 있습니다. 현재 Socket_set_blocking () 을 통해 비 블로킹 모드로 전환 한 다음 Socket_get_status () 를 통해 소켓 상태를 확인하여 차단을 피할 수 있습니다.
예를 들어:
<span><span><span class="hljs-title function_ invoke__">socket_set_blocking</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-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'blocked'</span></span><span>] == </span><span><span class="hljs-number">0</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>소켓이 비 블로킹 모드 일 때, 읽을 데이터가 없더라도 socket_read () 와 같은 기능은 즉시 반환됩니다. 반복적으로 무의미한 통화를 피하기 위해 Socket_get_status ()를 socket_get_status ()와 결합하여 현재 소켓이 데이터를 읽었는지 또는 파일 끝)에 도달했는지 여부를 결정할 수 있습니다.
<span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'eof'</span></span><span>]) {
</span><span><span class="hljs-keyword">break</span></span><span>; </span><span><span class="hljs-comment">// 읽을 데이터가 없습니다</span></span><span>
}
</span><span><span class="hljs-variable">$buffer</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">if</span></span><span> (</span><span><span class="hljs-variable">$buffer</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-comment">// 읽기 오류를 처리합니다</span></span><span>
</span><span><span class="hljs-keyword">break</span></span><span>;
}
</span><span><span class="hljs-variable">$data</span></span><span> .= </span><span><span class="hljs-variable">$buffer</span></span><span>;
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"데이터를 읽습니다: <span class="hljs-subst">$data</span></span></span><span>\n";
</span></span>위의 코드를 통해 EOF에 실시간으로 도달했는지 판단하고 불필요한 반복 판독 값을 피할 수 있습니다.
socket_get_status ()는 차단 상태를 확인할뿐만 아니라 소켓에 대한 다른 중요한 정보를 이해하는 데 도움이됩니다. 예를 들어, 소켓이 닫혔는지 (EOF 플래그) 또는 오류가 발생했는지 여부를 결정하는 데 사용될 수 있습니다.
<span><span><span class="hljs-variable">$status</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_status</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$status</span></span><span>[</span><span><span class="hljs-string">'eof'</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>socket_get_status ()는 실시간으로 소켓 상태를 얻을 수 있지만이 기능을 너무 자주 호출하면 성능 오버 헤드가 발생할 수 있습니다. 따라서 동시성이 높은 환경에서는 불필요한 상태 점검을 피하기 위해 통화 주파수가 합리적으로 제어됩니다.
이 두 기능을 사용할 때, 특히 소켓 작업 ( Socket_read () )를 수행 할 때 오류 처리를 수행해야합니다. 네트워크 문제 또는 기타 이유로 인해 소켓 작업이 실패 할 수 있으므로 실제로 사용할 때 적절한 오류 처리 로직을 추가해야합니다.
<span><span><span class="hljs-variable">$buffer</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">if</span></span><span> (</span><span><span class="hljs-variable">$buffer</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
</span><span><span class="hljs-variable">$error_code</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_last_error</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">"오류를 읽으십시오: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$error_code</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>socket_set_blocking () 및 socket_get_status ()를 사용하면 차단으로 인한 성능 병목 현상을 피하기 위해 소켓 상태 정보를 효과적으로 제어하고 얻을 수 있습니다. 실제 개발에서 블록 모드를 합리적으로 설정하고 EOF 및 오류 상태를 판단함으로써 프로그램의 응답 속도 및 견고성을 향상시킬 수 있습니다. 그러나 상태 검사 기능에 대한 빈번한 호출은 성능에 영향을 줄 수 있으므로 과도한 통화를 피하기 위해 적절한 시간에 확인해야합니다.
이 두 가지 기능을 합리적으로 사용하면 동시 연결 처리의 유연성과 효율성을 크게 향상시켜 PHP 네트워크 통신 애플리케이션이보다 안정적이고 효율적입니다.