현재 위치: > 최신 기사 목록> 어떤 일반적인 시나리오에서, Stream_Socket_Shutdown은 PHP 소켓 연결을 닫는 데 적합합니까?

어떤 일반적인 시나리오에서, Stream_Socket_Shutdown은 PHP 소켓 연결을 닫는 데 적합합니까?

M66 2025-06-22

PHP에는 네트워크 통신을 위해 소켓을 사용할 때 연결을 닫는 방법에는 여러 가지가 있습니다. 그중에서도 Stream_Socket_Shutdown 기능은 일반적인 방법으로 개발자가 소켓의 종료 프로세스를보다 세분화 할 수 있습니다. Stream_Socket_Shutdown 의 역할과 해당 시나리오의 역할을 이해하는 것은 코드의 견고성과 성능을 향상시키는 데 중요합니다.

stream_socket_shutdown 이란 무엇입니까?

stream_socket_shutdown 은 PHP에 소켓 연결을 닫기 위해 사용되는 방법입니다. Simple Fclose () 또는 Socket_close () 와 달리 더 많은 제어 옵션을 제공하여 개발자가 읽기 및 쓰기 작업을 닫고 연결을 완전히 닫을 지 여부를 선택할 수 있습니다. 기능 프로토 타입은 다음과 같습니다.

 <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(resource </span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$how</span></span><span>);
</span></span>
  • $ socket : 닫을 수있는 소켓 자원을 나타냅니다.

  • $ $ 방법 : 닫힌 작업 유형을 제어합니다. 다음은 다음과 같습니다.

    • stream_shut_rd : 읽기 작업을 끄고 쓰기 기능을 유지하십시오.

    • stream_shut_wr : 쓰기 작업을 끄고 읽기 기능을 유지합니다.

    • stream_shut_rdwr : 동시에 읽기 및 쓰기 작업을 닫고 연결을 완전히 닫습니다.

해당 시나리오

1. 단방향 통신 중에 쓰기 작업을 끕니다

일부 응용 프로그램 시나리오에서는 클라이언트 또는 서버가 데이터를 전송 한 후 더 이상 쓸 필요가 없지만 상대방이 응답 할 때까지 기다립니다. 예를 들어, HTTP 요청이 완료된 후 클라이언트는 더 이상 데이터를 보내지 않지만 서버가 응답을 반환 할 때까지 기다려야합니다. 현재 Stream_Socket_Shutdown을 사용하여 쓰기 작동을 닫고 자원 소비를 줄이며 성능을 향상시킬 수 있습니다.

샘플 코드 :

 <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-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"</span></span><span>);

</span><span><span class="hljs-comment">// 요청을 보내고 나면 쓰기 작업을 닫습니다,더 이상 데이터를 전송하지 않습니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_WR);

</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__">fread</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-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

이 예에서 클라이언트는 HTTP 요청을 보냈으며 더 이상 서버에 데이터를 작성할 필요가 없으므로 Stream_Socket_Shutdown을 호출하여 쓰기 작업이 닫힙니다.

2. 데이터 만 읽을 때 쓰기 작업을 끄십시오.

일부 응용 프로그램에서 클라이언트 또는 서버는 상대방의 데이터 만 읽고 더 이상 데이터를 보내지 않아도됩니다. 현재 Stream_Socket_Shutdown을 사용하여 쓰기 작업을 닫아 연결이 더 이상 불필요한 쓰기 리소스를 소비하지 않도록 할 수 있습니다. 예를 들어, FTP 프로토콜의 일부 모드에서 클라이언트와 서버는 글을 쓰지 않고 데이터 만 읽어야합니다.

샘플 코드 :

 <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:21"</span></span><span>);

</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"USER anonymous\r\n"</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"PASS anonymous\r\n"</span></span><span>);

</span><span><span class="hljs-comment">// 더 이상 데이터를 전송하지 않습니다,쓰기 작업을 닫습니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_WR);

</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__">fread</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-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

쓰기 작업을 끄면 불필요한 리소스 사용량을 줄이고 통신 프로세스를보다 효율적으로 보장 할 수 있습니다.

3. 양방향 통신이 완료된 후 연결이 닫힙니다

라이브 채팅 시스템 또는 온라인 게임과 같은 양방향 통신이 필요한 일부 응용 프로그램의 경우 일반적으로 클라이언트 또는 서버 측에서 데이터 교환을 완료 한 후 Stream_Socket_Shutdown을 호출하여 연결을 완전히 닫고 모든 관련 리소스를 해제합니다. Stream_shut_rdwr를 사용하여 연결을 닫아 읽기 및 쓰기 작업이 모두 종료되도록합니다.

샘플 코드 :

 <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:12345"</span></span><span>);

</span><span><span class="hljs-comment">// 양방향 데이터 교환을 수행하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">fwrite</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, </span><span><span class="hljs-string">"Hello Server!"</span></span><span>);
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</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-comment">// 양방향 통신을 완료 한 후 연결을 완전히 닫습니다</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_RDWR);

</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

현재 양 당사자는 더 이상 커뮤니케이션을 계속할 필요가 없습니다. Call Stream_Socket_Shutdown을 사용하여 읽기 및 쓰기 작업을 닫으려면 소켓 연결이 완전히 닫혀 있는지 확인하십시오.

4. 네트워크 중단 또는 오류 처리

일부 특별한 경우, 비정상적인 중단 또는 오류로 인해 네트워크 연결이 닫힐 수 있습니다. stream_socket_shutdown을 사용하여 소켓의 종료 프로세스를보다 세분화합니다. 예를 들어, 네트워크 중단 또는 응용 프로그램 예외가 발생하면 계속해서 리소스 점유를 방지하기 위해 읽기 또는 쓰기 작업을 선택적으로 꺼질 수 있습니다.

샘플 코드 :

 <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-keyword">if</span></span><span> (!</span><span><span class="hljs-variable">$socket</span></span><span>) {
    </span><span><span class="hljs-keyword">die</span></span><span>(</span><span><span class="hljs-string">"Unable to connect to server"</span></span><span>);
}

</span><span><span class="hljs-comment">// 일부 오류가 발생한다고 가정합니다,데이터 작성을 중지하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_WR);

</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__">fread</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-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

여기서 예외 또는 오류가 발생하면 쓰기 작업을 닫아 서버에 미치는 영향을 완화하기 위해 데이터를 작성하려는 추가 시도를 피합니다.

5. 시간 초과 메커니즘을 구현하십시오

일부 응용 프로그램은 연결이 오랫동안 응답하지 않을 때 소켓 연결을 적극적으로 닫는 시간 초과 메커니즘을 구현해야 할 수도 있습니다. 이 경우 Stream_Socket_Shutdown은 더 이상 필요하지 않은 연결을 닫는 데 사용될 수 있으므로 교착 상태 나 장기적인 네트워크 리소스 점유를 피할 수 있습니다.

샘플 코드 :

 <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">die</span></span><span>(</span><span><span class="hljs-string">"Unable to connect: <span class="hljs-subst">$errstr</span></span></span><span> (</span><span><span class="hljs-subst">$errno</span></span><span>)");
}

</span><span><span class="hljs-comment">// 타임 아웃 메커니즘을 설정하십시오,시간 초과 후 연결을 닫습니다</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">10</span></span><span>); </span><span><span class="hljs-comment">// 시간 초과 시간을 설정하십시오10두번째</span></span><span>
</span><span><span class="hljs-variable">$response</span></span><span> = </span><span><span class="hljs-title function_ invoke__">fread</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-title function_ invoke__">feof</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">"Connection timed out or completed.\n"</span></span><span>;
    </span><span><span class="hljs-title function_ invoke__">stream_socket_shutdown</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, STREAM_SHUT_RDWR);
}

</span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>);
</span></span>

이 예에서는 연결이 10 초 이내에 응답하지 않으면 연결을 닫기 위해 Stream_Socket_Shutdown이 호출됩니다.

요약

stream_socket_shutdown은 소켓 연결 폐쇄에 대한 세밀한 제어를 제공하는 PHP에서 매우 유용한 기능입니다. 단방향 통신 중 쓰기 작업 폐쇄, 양방향 통신 후 연결 폐쇄, 네트워크 예외 처리 등을 포함한 다양한 시나리오에 적합합니다. 사용 방법을 이해하면 개발자가 네트워크 리소스를보다 효과적으로 관리하고 응용 프로그램 안정성 및 성능을 향상시키는 데 도움이 될 수 있습니다.