Aktueller Standort: Startseite> Neueste Artikel> Wie benutze ich Socket_Select, um zu überprüfen, ob mehrere Sockets lesbar sind? PHP Praktische Tipps Erklärung

Wie benutze ich Socket_Select, um zu überprüfen, ob mehrere Sockets lesbar sind? PHP Praktische Tipps Erklärung

gitbox 2025-09-12
<span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// Dieses Dokument dient Unterrichtszwecken,Zeigen, wie man PHP Verwendet in socket_select Überprüfen Sie mehrere Socket Ist es lesbar。</span></span><span>
</span><span><span class="hljs-comment">// Bitte stellen Sie sicher, dass es aktiviert ist sockets Erweitert。</span></span><span>

</span><span><span class="hljs-comment">// Erstellen Sie ein Beispiel sockets(Server socket und mehrere Kunden socket),Lassen Sie den Erstellungsprozess aus, um sich auf die Kernlogik zu konzentrieren。</span></span><span>

</span><span><span class="hljs-comment">// -------------------------------</span></span><span>

</span><span><span class="hljs-meta">?&gt;</span></span><span>

</span><span><span class="hljs-comment"># Wie man es benutzt socket_select Überprüfen Sie mehrere Socket Ist es lesbar?PHP Erklärung praktischer Fähigkeiten</span></span><span>

Entwicklung netzwerkbasierter Kommunikation PHP Bei der Bewerbung,Wir müssen oft mehrere Verbindungen gleichzeitig verarbeiten,Besonders beim Bau von Chaträumen、游戏Server或即时通信系统等场景中。Zu diesem Zeitpunkt,`</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>()` Funktionen sind besonders wichtig。Es ermöglicht es Ihnen, mehrere zu gehen socket Nicht blockierende Leseschreibprüfungen werden zwischen durchgeführt,Die Effizienz erheblich verbessern。

In diesem Artikel wird Ihnen ein detailliertes Verständnis dafür vermittelt, wie Sie ihn verwenden können `socket_select` Überprüfen Sie mehrere socket Ist es lesbar,Und geben Sie ein einfaches und praktisches Beispiel。

</span><span><span class="hljs-comment">## Was ist socket_select?</span></span><span>

`</span><span><span class="hljs-title function_ invoke__">socket_select</span></span><span>()` Ja PHP Nach unten `</span><span><span class="hljs-title function_ invoke__">select</span></span><span>()` Einkapselung von Systemaufrufen。Es wird verwendet, um einen Satz von zu erkennen sockets Ja否可以进行读、Schreib- oder Ausnahmeoperation,Und das Zeitübergang kann festgelegt werden。

```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> &amp;</span><span><span class="hljs-variable">$read</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> &amp;</span><span><span class="hljs-variable">$write</span></span><span>, </span><span><span class="hljs-keyword">array</span></span><span> &amp;</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>
  • $ read : Sockel, die Sie überwachen möchten, ob sie lesbar sind.

  • $ write : Sie möchten überwachen, ob die Steckdosen (NULL übergeben werden können).

  • $ außer : Sie möchten überwachen, ob es Ausnahmehöhlen gibt (können NULL übergeben).

  • $ TV_SEC und $ TV_USEC : sind die Zeitlimiten von Sekunden bzw. Mikrosekunden.

Praktisches Beispiel: Überprüfen Sie, ob mehrere Sockets Daten lesen müssen

Hier ist ein PHP -Code -Snippet, das tatsächlich Socket_Select verwendet, wodurch über mehrere Client -Sockets Daten angekommen sind:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-comment">// 创建主Server 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">// Nicht blockierende festlegen</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">// Welche werden überprüft socket Lesbar(Keine Blockierung,1 Zweites Timeout)</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 scheitern:"</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">// Es gibt eine neue Verbindung</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">"Der neue Client ist verbunden。"</span></span><span> . PHP_EOL;
        } </span><span><span class="hljs-keyword">else</span></span><span> {
            </span><span><span class="hljs-comment">// Ein Client sendet Daten</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">// Kundenentzündung</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">"Kundenentzündung。"</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">"Daten empfangen:"</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">?&gt;</span></span><span>
</span></span>

Zusammenfassung der wichtigsten Punkte

  1. Nicht blockierende Sockel : Um zu vermeiden, dass der Hauptprozess blockiert wird, sollten alle Sockets auf den nicht blockierenden Modus eingestellt werden.

  2. Anfrage zur Verbindungsanforderung für den Hauptbuchse : Wenn Socket_Select erkennt, dass der Hauptbuchse lesbar ist, zeigt dies an, dass eine neue Client -Verbindungsanforderung vorliegt.

  3. Client -Socket -Überprüfungsdaten : Wenn ein Client -Socket lesbar ist, bedeutet dies, dass der Client die Daten gesendet hat.

  4. Hinweis : Wenn die Lektüre fehlschlägt oder eine leere Zeichenfolge zurückgegeben wird, sollte der Client als getrennt angesehen werden.

Abschluss

Socket_Select () ist ein wichtiges Instrument zur Behandlung der gleichzeitigen Socket -Kommunikation. Im Vergleich zu der Tatsache, dass jede Verbindung über einen Thread oder einen Prozess verfügt, kann das ausgewählte Modell eine große Anzahl von Verbindungen leichter und kontrollierbar verwalten. Durch die Kompetenz wird Ihre PHP -Netzwerkanwendung stabiler und effizienter.

Ich hoffe, dieser Artikel kann Ihnen helfen, die Nutzungsszenarien und Praktiken von Socket_Select zu verstehen und in Ihrem Projekt wirklich eine Rolle zu spielen.

 <span></span>