현재 위치: > 최신 기사 목록> Stream_Set_Timeout이 기본 소켓 타임 아웃 설정과 충돌하는 이유는 무엇입니까? 그것을 피하는 방법?

Stream_Set_Timeout이 기본 소켓 타임 아웃 설정과 충돌하는 이유는 무엇입니까? 그것을 피하는 방법?

gitbox 2025-09-17

Stream_Set_Timeout이 기본 소켓 타임 아웃 설정과 충돌하는 이유는 무엇입니까? 그것을 피하는 방법?

PHP를 사용하여 네트워크를 프로그래밍 할 때 Stream_set_timeout은 스트림의 시간 초과를 설정할 수있는 매우 유용한 기능입니다. 그러나 경우에 따라 개발자는 Stream_Set_Timeout을 통해 타임 아웃을 설정했지만 네트워크 운영은 예상 시간에 시간을 초과하지 않는 것으로 보이며 심지어 충돌 할 수 있음을 알게 될 것입니다. 이 현상의 발생은 종종 PHP의 기본 소켓 타임 아웃 설정과 관련이 있습니다.

1. Stream_set_timeout 작동 방식

stream_set_timeout 함수는 스트림의 시간 초과 (예 : 파일, 소켓 등)를 설정하는 데 사용됩니다. 이 기능을 통해 개발자는 스트림의 최대 대기 시간을 지정할 수 있습니다. 일반적으로 타임 아웃은 읽기 작업 또는 쓰기 작업을위한 것입니다. 설정 시간 초과 시간 내에 작업이 완료되지 않으면 PHP는 타임 아웃 메커니즘을 트리거하고 False를 반환합니다.

 <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"연결이 실패했습니다: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>);  </span><span><span class="hljs-comment">// 시간 초과 시간을 설정하십시오 5 두번째</span></span><span>
    </span><span><span class="hljs-comment">// 추가 작동</span></span><span>
}
</span></span>

위의 코드에서 Stream_set_timeout ($ socket, 5)는 소켓 스트림의 타임 아웃을 5 초로 설정합니다. 즉, 5 초 이내에 유효한 읽기 또는 쓰기 작업이 수행되지 않으면 스트림이 시간 초과로 간주됩니다.

2. 기본 소켓 타임 아웃 설정의 영향

그러나 Stream_Set_Timeout은 스트림의 시간 초과 설정 만 수정할 수 있지만 PHP의 기본 소켓 타임 아웃 설정 (일반적으로 default_socket_timeout configuration directive에 의해 결정됨)에 상호 영향을 미칩니다. default_socket_timeout은 모든 소켓 작업에 대한 기본 타임 아웃을 설정하는 PHP 구성 파일의 매개 변수입니다. 이 기본값은 타임 아웃이 명시 적으로 설정되지 않은 경우 사용됩니다.

 <span><span><span class="hljs-comment">; php.ini 파일의 기본값</span></span><span>
</span><span><span class="hljs-attr">default_socket_timeout</span></span><span> = </span><span><span class="hljs-number">60</span></span><span>
</span></span>

default_socket_timeout을 수정하지 않은 경우 기본값은 60 초입니다. 이 경우 PHP는이 글로벌 타임 아웃을 사용하여 Stream_set_timeout을 통해 다른 타임 아웃을 설정하더라도 모든 소켓 작업을 관리합니다. 지정된 시간 내에 스트림 조작이 완료되지 않으면 default_socket_timeout은 stream_set_timeout 설정을 무시할 수 있으므로 비정상적인 프로그램 동작이 발생할 수 있습니다.

3. 왜 갈등이 발생합니까?

PHP의 소켓 작동은 실제로 Socket_set_option () 을 통해 기본 소켓 구성을 설정하기 때문에 stream_set_timeout 의 시간 초과와 default_socket_timeout 의 시간 초과 사이에 충돌이 발생합니다. stream_set_timeout은 스트림을 통해 타임 아웃을 설정하는 데 사용되며 기본 소켓 타임 아웃 설정은 전역입니다.

경우에 따라 Stream_set_timeout은 스트림의 시간 초과를 성공적으로 수정할 수 있지만 Default_socket_timeout이 Stream_set_timeout 보다 더 길게 설정되면 socket_set_option 내부를 호출 할 때 전역 구성된 타임 아웃 값을 사용할 수 있으므로 stream_set_timeout 의 설정이 유명합니다.

4. 갈등을 피하는 방법?

이 충돌을 피하기 위해 가장 좋은 방법은 default_socket_timeoutstream_set_timeout 설정 사이의 일관성을 보장하는 것입니다. 다음 방법을 수행 할 수 있습니다.

  1. default_socket_timeout 구성 <br>을 조정하십시오 php.ini 구성 파일의 default_socket_timeout 이 코드에서 설정 한 stream_set_timeout 과 일치하는지 확인하십시오. 짧은 시간 초과를 사용하려면 php.ini 에서 값을 더 작은 값으로 설정할 수 있습니다.

     <span><span><span class="hljs-attr">default_socket_timeout</span></span><span> = </span><span><span class="hljs-number">5</span></span><span>
    </span></span>
  2. 시간 초과를 명시 적으로 설정했습니다 <br> Stream_Socket_Client () 또는 기타 네트워크 스트리밍 작업을 사용할 때마다 명시 적으로 Stream_set_timeout ()을 호출하여 타임 아웃이 정확한지 확인하십시오.

     <span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>);
    </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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"연결이 실패했습니다: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)";
    } </span><span><span class="hljs-keyword">else</span></span><span> {
        </span><span><span class="hljs-title function_ invoke__">stream_set_timeout</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-number">5</span></span><span>);  </span><span><span class="hljs-comment">// 시간 초과가 있는지 확인하십시오 5 두번째</span></span><span>
        </span><span><span class="hljs-comment">// 추가 작동</span></span><span>
    }
    </span></span>
  3. Stream_Context_create를 사용하여 스트림의 시간 초과를 구성하십시오 <br> 또 다른 방법은 stream_context_create를 통해 스트림 컨텍스트를 작성하고 컨텍스트에서 시간 초과를 설정하는 것입니다. 이것은 소켓 타임 아웃을 설정할뿐만 아니라 다른 스트림 관련 구성을 처리합니다.

     <span><span><span class="hljs-variable">$context</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_context_create</span></span><span>([
        </span><span><span class="hljs-string">'socket'</span></span><span> =&gt; [
            </span><span><span class="hljs-string">'timeout'</span></span><span> =&gt; </span><span><span class="hljs-number">5</span></span><span>
        ]
    ]);
    </span><span><span class="hljs-variable">$socket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">stream_socket_client</span></span><span>(</span><span><span class="hljs-string">"tcp://example.com:80"</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-number">30</span></span><span>, STREAM_CLIENT_CONNECT, </span><span><span class="hljs-variable">$context</span></span><span>);
    </span></span>

이러한 방법을 통해 Stream_Set_Timeout 으로 설정된 타임 아웃이 PHP 기본 소켓 타임 아웃과 충돌하지 않도록하여 일관되지 않은 프로그램 동작을 피할 수 있습니다.

5. 요약

Stream_set_timeout 은 PHP에서 스트림의 시간 초과를 설정하는 강력한 기능입니다. 그러나 그것을 사용할 때는 흐름의 시간 초과 동작에 영향을 줄 수 있으므로 PHP의 기본 소켓 타임 아웃 설정 ( default_socket_timeout )에주의를 기울여야합니다. 구성 파일에서 default_socket_timeout을 조정하거나 코드에서 시간 초과를 명시 적으로 설정하면 이러한 충돌을 피하고 예상 시간 초과에서 네트워크 작업을 수행 할 수 있는지 확인할 수 있습니다.