<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 이 문서는 교육 목적을위한 것입니다,방법을 보여주십시오 PHP 사용 socket_select 다중 점검 Socket 읽을 수 있습니까?。</span></span><span>
</span><span><span class="hljs-comment">// 활성화되어 있는지 확인하십시오 sockets 펼친。</span></span><span>
</span><span><span class="hljs-comment">// 예제를 만듭니다 sockets(섬기는 사람 socket 그리고 여러 고객 socket),핵심 논리에 집중하기 위해 생성 과정을 생략하십시오。</span></span><span>
</span><span><span class="hljs-comment">// -------------------------------</span></span><span>
</span><span><span class="hljs-meta">?></span></span><span>
</span><span><span class="hljs-comment"># 사용하는 방법 socket_select 다중 점검 Socket 읽을 수 있습니까??PHP 실용적인 기술의 설명</span></span><span>
네트워크 기반 통신 개발 PHP 신청할 때,우리는 종종 동시에 여러 연결을 처리해야합니다.,특히 대화방을 만들 때、游戏섬기는 사람或即时通信系统等场景中。현재,`</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>()` 기능은 특히 중요합니다。그것은 당신이 여러 번으로 갈 수 있습니다 socket 비 블로킹 읽기 쓰기 검사는 그 사이에 수행됩니다,효율성을 크게 향상시킵니다。
이 기사는 사용 방법에 대한 심층적 인 이해를 제공합니다. `socket_select` 다중 점검 socket 읽을 수 있습니까?,간단하고 실용적인 모범을 보여줍니다。
</span><span><span class="hljs-comment">## 무엇인가요 socket_select?</span></span><span>
`</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>()` 예 PHP 바닥에 `</span><span><span class="hljs-title function_ invoke__">select</span></span><span>()` 시스템 호출의 캡슐화。세트를 감지하는 데 사용됩니다 sockets 예否可以进行读、쓰기 또는 예외 작동,그리고 시간 초과를 설정할 수 있습니다。
```php
</span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>(</span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> &</span><span><span class="hljs-variable">$except</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$tv_sec</span></span><span>, </span><span><span class="hljs-keyword">int</span></span><span> </span><span><span class="hljs-variable">$tv_usec</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>)
</span></span>$ 읽기 : 읽을 수 있는지 여부를 모니터링하려는 소켓.
$ 쓰기 : 소켓을 전달할 수 있는지 여부를 모니터링하려고합니다.
예외 : 예외 소켓이 있는지 여부를 모니터링하려고합니다 (NULL을 통과 할 수 있음).
$ tv_sec 및 $ tv_usec : 각각 초 타임 아웃 시간과 마이크로 초입니다.
다음은 실제로 Socket_Select를 사용하는 PHP 코드 스 니펫이 있습니다. 여기에는 여러 클라이언트 소켓이 데이터가 도착했는지 확인합니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 创建主섬기는 사람 socket</span></span><span>
</span><span><span class="hljs-variable">$server</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_bind</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>, </span><span><span class="hljs-string">'127.0.0.1'</span></span><span>, </span><span><span class="hljs-number">8888</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_listen</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-comment">// 비 블로킹을 설정하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-variable">$clients</span></span><span> = [</span><span><span class="hljs-variable">$server</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">$readSockets</span></span><span> = </span><span><span class="hljs-variable">$clients</span></span><span>;
</span><span><span class="hljs-variable">$writeSockets</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-variable">$exceptSockets</span></span><span> = </span><span><span class="hljs-literal">null</span></span><span>;
</span><span><span class="hljs-comment">// 어느 것이 확인되었는지 socket 읽을 수 있습니다(차단 없음,1 두 번째 시간 초과)</span></span><span>
</span><span><span class="hljs-variable">$numChangedSockets</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>(</span><span><span class="hljs-variable">$readSockets</span></span><span>, </span><span><span class="hljs-variable">$writeSockets</span></span><span>, </span><span><span class="hljs-variable">$exceptSockets</span></span><span>, </span><span><span class="hljs-number">1</span></span><span>);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$numChangedSockets</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">"socket_select 실패하다:"</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>()) . PHP_EOL;
</span><span><span class="hljs-keyword">break</span></span><span>;
}
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$readSockets</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$sock</span></span><span>) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$sock</span></span><span> === </span><span><span class="hljs-variable">$server</span></span><span>) {
</span><span><span class="hljs-comment">// 새로운 연결이 있습니다</span></span><span>
</span><span><span class="hljs-variable">$newClient</span></span><span> = </span><span><span class="hljs-title function_ invoke__">socket_accept</span></span><span>(</span><span><span class="hljs-variable">$server</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">socket_set_nonblock</span></span><span>(</span><span><span class="hljs-variable">$newClient</span></span><span>);
</span><span><span class="hljs-variable">$clients</span></span><span>[] = </span><span><span class="hljs-variable">$newClient</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"새 클라이언트가 연결되어 있습니다。"</span></span><span> . PHP_EOL;
} </span><span><span class="hljs-keyword">else</span></span><span> {
</span><span><span class="hljs-comment">// 클라이언트는 데이터를 보냅니다</span></span><span>
</span><span><span class="hljs-variable">$data</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">socket_read</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>, </span><span><span class="hljs-number">1024</span></span><span>, PHP_NORMAL_READ);
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span> || </span><span><span class="hljs-variable">$data</span></span><span> === </span><span><span class="hljs-string">""</span></span><span>) {
</span><span><span class="hljs-comment">// 클라이언트 단절</span></span><span>
</span><span><span class="hljs-variable">$index</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_search</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>, </span><span><span class="hljs-variable">$clients</span></span><span>);
</span><span><span class="hljs-keyword">unset</span></span><span>(</span><span><span class="hljs-variable">$clients</span></span><span>[</span><span><span class="hljs-variable">$index</span></span><span>]);
</span><span><span class="hljs-title function_ invoke__">socket_close</span></span><span>(</span><span><span class="hljs-variable">$sock</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"클라이언트 단절。"</span></span><span> . PHP_EOL;
} </span><span><span class="hljs-keyword">else</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__">trim</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>) . PHP_EOL;
}
}
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>비 블로킹 소켓 : 기본 프로세스 차단을 피하려면 모든 소켓을 비 블로킹 모드로 설정해야합니다.
기본 소켓 확인 연결 요청 : Socket_Select가 기본 소켓을 읽을 수 있음을 감지하면 새로운 클라이언트 연결 요청이 있음을 나타냅니다.
클라이언트 소켓 확인 데이터 : 클라이언트 소켓을 읽을 수 있으면 클라이언트가 데이터를 보냈 음을 의미합니다.
참고 : 읽기가 실패하거나 빈 문자열이 반환되면 클라이언트가 연결이 끊어진 것으로 간주되어야합니다.
socket_select () 는 동시 소켓 통신을 처리하기위한 핵심 도구입니다. 각 연결에 스레드 또는 프로세스가 있다는 사실과 비교하여 선택 모델은 더 가볍고 제어 가능한 많은 연결을 관리 할 수 있습니다. 능숙하게 PHP 네트워크 응용 프로그램이보다 안정적이고 효율적으로 만들 것입니다.
이 기사가 Socket_Select 의 사용 시나리오와 관행을 이해하는 데 도움이되기를 바랍니다. 프로젝트에서 실제로 역할을 할 수 있습니다.
<span></span>