PHP에서 Socket_Listen 함수는 소켓이 들어오는 연결 요청을받을 수 있도록 생성 된 소켓을 설정하는 데 사용됩니다. 일반적 으로이 기능은 Socket_create 및 Socket_bind 와 함께 사용하여 클라이언트 요청을 처리하기 위해 전체 서버 소켓을 구축합니다. 이 기사에서는 Socket_Listen 기능의 사용법을 자세히 분석하고 올바르게 청취를 켜는 방법을 안내합니다.
<span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_listen</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">$backlog</span></span><span> = </span><span><span class="hljs-number">0</span></span><span> )
</span></span>
$ Socket : Socket_create를 통해 생성 된 소켓 리소스 및 Socket_bind를 통해 주소 및 포트에 바인딩되었습니다.
$ backlog : 최대 보류중인 연결 요청 수를 지정합니다. 운영 체제 커널에서 허용되지 않은 처리되지 않은 연결의 대기열 길이를 정의합니다. 대기열이 가득 차면 새 연결 요청이 거부됩니다. 공통 값은 128 이지만 요구 사항에 따라 조정할 수 있습니다.
성공하면 0을 반환합니다.
실패시, 거짓이 반환되고 Socket_last_error () 를 통해 오류 정보를 얻을 수 있습니다.
socket_listen을 사용하려면 일반적으로 socket_create를 통해 소켓을 만들고 지정된 IP 주소와 socket_bind가 있는 포트에 바인딩해야합니다. 다음으로 Socket_Listen을 사용 하여이 소켓이 클라이언트의 연결 요청을 듣도록 시작할 수 있습니다. 기본 서버 예는 다음과 같습니다.
<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">"无法만들다소켓: "</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">// 지정된 것에 결합합니다IP주소와 포트</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_bind</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-variable">$result</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_listen</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-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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"서버가 듣고 있습니다 <span class="hljs-subst">$address</span></span></span><span>:</span><span><span class="hljs-subst">$port</span></span><span>...\n";
</span><span><span class="hljs-comment">// 연결을받습니다</span></span><span>
</span><span><span class="hljs-variable">$clientSocket</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</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">$clientSocket</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-keyword">echo</span></span><span> </span><span><span class="hljs-string">"클라이언트가 연결되어 있습니다\n"</span></span><span>;
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$clientSocket</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>
이 예에서 :
socket_create를 통해 TCP 소켓을 만듭니다.
Socket_bind를 사용하여 소켓을 127.0.0.1:8080 , 즉 로컬 주소의 포트 8080에 바인딩하십시오.
Socket_Listen을 호출하려면 연결 요청을 듣기 시작하면 두 번째 매개 변수 5는 허용되지 않은 최대 연결 수를 나타냅니다.
Socket_accept를 사용하여 클라이언트의 연결을 수락하십시오.
Socket_Listen 의 두 번째 매개 변수 백 로그는 커널의 연결 큐의 길이를 지정합니다. 이 큐는 Socket_accept 에서 허용되지 않은 연결을 저장합니다. 이 매개 변수는 더 크지 않다는 점에 유의해야합니다. 더 높은 값이 더 많은 대기 연결을 수용하도록 설정할 수 있지만, 이는 더 많은 시스템 리소스를 차지할 수 있으며 설정이 너무 커서 처리 전원이 없으면 자원 낭비로 이어질 수 있습니다.
128 : 이것은 공통 기본값이며 대부분의 응용 프로그램 시나리오에 적합합니다.
0 : 0 으로 설정하면 시스템은 기본 대기열 길이를 사용합니다. 일반적으로 0 값에 대해 걱정할 필요가 없습니다.
네트워크를 프로그래밍 할 때 오류는 불가피합니다. Socket_listen은 실패하면 False를 반환합니다. socket_last_error를 사용하여 손쉬운 디버깅을 위해 자세한 오류 정보를 얻을 수 있습니다. 예를 들어:
<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-variable">$errorCode</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 class="hljs-subst">$errorCode</span></span></span><span>, 오류 메시지: " . </span><span><span class="hljs-title function_ invoke__">socket_strerror</span></span><span>(</span><span><span class="hljs-variable">$errorCode</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span></span>
이 코드는 문제를 해결하는 데 도움이되는 자세한 오류 정보를 반환합니다.
비 블로킹 모드 : 청취 중에 소켓이 프로그램을 차단하지 않으려면 socket_set_nonblock 함수를 사용하여 소켓을 비 블로킹 모드로 설정할 수 있습니다.
멀티 스레드/다중 프로세스 : 많은 동시 연결을 다룰 때는 기본 스레드를 차단하지 않고 다중 클라이언트 연결을 처리하기 위해 다중 프로세스 또는 멀티 스레드 모델 (예 : PCNTL_FORK 또는 PTHREADS 확장)을 사용하는 것을 고려할 수 있습니다.
청소 : 소켓을 사용한 후에는 Socket_close를 호출하여 소켓을 닫고 리소스를 해제하는 것을 잊지 마십시오.
Socket_listen 은 PHP 소켓 프로그래밍에서 매우 중요한 기능입니다. 바운드 소켓을 청취하고 클라이언트가 연결되기를 기다리는 것은 책임이 있습니다. Socket_Listen 을 올바르게 사용하면 PHP 응용 프로그램이 클라이언트의 연결 요청을 처리하고 안정적인 네트워크 서비스를 제공 할 수 있습니다. 백 로그 매개 변수가 올바르게 설정되고 오류가 올바르게 처리되어 응용 프로그램의 신뢰성과 안정성을 효과적으로 향상시킬 수 있습니다.