현재 위치: > 최신 기사 목록> socket_set_option을 통해 소켓의 최대 보내기 버퍼 크기를 제어하는 방법?

socket_set_option을 통해 소켓의 최대 보내기 버퍼 크기를 제어하는 방법?

gitbox 2025-08-18

PHP를 사용하여 소켓 기반 네트워크 프로그램을 개발할 때, 전송 버퍼의 크기를 제어하면 특히 빅 데이터 전송 또는 높은 동시 연결이 처리되는 시나리오에서 프로그램 성능을 어느 정도 향상시킬 수 있습니다. PHP가 제공하는 Socket_set_option () 함수를 사용하면 전송 버퍼의 크기를 설정하는 것을 포함하여 소켓 연결의 동작을 신중하게 제어 할 수 있습니다. 이 기사는이 기능을 사용하여 소켓의 최대 보내기 버퍼 크기를 설정하고 관련 예방 조치를 설명하는 방법을 소개합니다.

1. socket_set_option () 소개

socket_set_option () 은 소켓 옵션을 설정하는 데 PHP에서 사용되는 기능이며 프로토 타입은 다음과 같습니다.

 <span><span><span class="hljs-keyword">bool</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_set_option</span></span><span>(
    Socket </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">$level</span></span><span>,
    </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$option</span></span><span>,
    </span><span><span class="hljs-keyword">mixed</span></span><span> </span><span><span class="hljs-variable">$value</span></span><span>
)
</span></span>
  • $ 소켓 : Socket_create () 에 의해 생성 된 소켓 리소스.

  • $ 레벨 : 옵션 레벨, sol_socket이 일반적으로 사용됩니다.

  • $ 옵션 : SO_SNDBUF 와 같은 특정 옵션을 설정하면 송신 버퍼 크기가 나타납니다.

  • $ 값 : 옵션에 따라 부울 값, 정수 등이 될 수있는 옵션의 값.

2. 보내기 버퍼 크기를 설정하십시오

버퍼 크기를 보내는 옵션 이름은 SO_SNDBUF 입니다. 다음 코드로 설정할 수 있습니다.

 <span><span><span class="hljs-meta">&lt;?php</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">die</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-comment">// 전송 버퍼 크기를 설정하십시오,예를 들어 1MB</span></span><span>
</span><span><span class="hljs-variable">$bufferSize</span></span><span> = </span><span><span class="hljs-number">1024</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__">socket_set_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_SNDBUF, </span><span><span class="hljs-variable">$bufferSize</span></span><span>)) {
    </span><span><span class="hljs-keyword">die</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-variable">$socket</span></span><span>)));
}

</span><span><span class="hljs-comment">// 설정이 성공했는지 확인하십시오</span></span><span>
</span><span><span class="hljs-variable">$current</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_get_option</span></span><span>(</span><span><span class="hljs-variable">$socket</span></span><span>, SOL_SOCKET, SO_SNDBUF);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"현재 보내기 버퍼 크기: <span class="hljs-subst">{$current}</span></span></span><span> 바이트\n";

</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">?&gt;</span></span><span>
</span></span>

운영 체제는 설정 한 크기에 따라 버퍼를 엄격하게 적용하지 않을 수 있으며 일반적으로 SETCOCH_GET_OPTION () 을 통해 얻은 값이 설정 값보다 약간 클 수 있습니다.

3. 실제 응용 시나리오

1. 큰 패킷 변속기

애플리케이션이 소켓을 통해 많은 양의 데이터를 전송 해야하는 경우 너무 작은 전송 버퍼로 인해 시스템 호출 (쓰기/보내기)이 발생하여 효율성에 영향을 미칩니다. 버퍼를 적절하게 늘리면 통화 수가 줄어들고 처리량을 늘릴 수 있습니다.

2. 높은 동시성 서버

서버가 짧은 시간 안에 많은 수의 클라이언트 요청을 처리하는 경우, 전송 버퍼가 너무 작 으면 데이터 차단 또는 전송 실패가 발생할 수 있습니다. 더 큰 버퍼를 사전 설정하면 시스템 결함 공차가 향상 될 수 있습니다.

4. 주목할만한 것들

  • 버퍼 크기를 설정한다고해서 즉시 적용되며 운영 체제가 최대 한계가있을 수 있습니다.

  • 일부 플랫폼 (예 : Linux)에는 /proc/sys/net/core/wmem_max 와 같은 최대 버퍼 크기에 커널 매개 변수 제한이 있습니다.

  • 버퍼를 늘리면 더 많은 메모리 리소스가 소비되며 실제 요구 및 서버 기능에 따라 설정해야합니다.

  • 소켓을 설정하기 전에 소켓이 성공적으로 생성되었는지 확인하는 것이 가장 좋습니다. 그렇지 않으면 설정이 작동하지 않습니다.

5. 요약

socket_set_option ()을 통해 보내기 버퍼 크기를 설정하는 것은 PHP 소켓 애플리케이션의 성능을 최적화하는 효과적인 수단입니다. 특정 사용 시나리오와 시스템 제한을 결합하여 데이터 전송의 효율성과 안정성을보다 합리적으로 제어 할 수 있습니다. 설정이 예상 결과를 달성 할 수 있도록 개발자가 Socket_get_option () 로 실제 버퍼 크기를 확인하는 것이 좋습니다.