In der PHP -Netzwerkprogrammierung ist die Funktion Socket_Select das Kernwerkzeug zur Implementierung von Multiplexing (E/A -Multiplexing). Es ermöglicht das Programm, mehrere Sockets gleichzeitig anzuhören, zu bestimmen, welche Sockets lesbar, beschreibbar sind oder Ausnahmen haben, das Blockieren und Warten vermeiden und somit gleichzeitig mit gleichzeitigen Verbindungen umgehen können. In diesem Artikel werden praktische Fälle kombiniert, um die Verwendung von Socket_Select und seiner Anwendung in der PHP -Netzwerkprogrammierung zu erläutern.
Socket_Select wird verwendet, um eine Reihe von Socket -Ressourcen zu überwachen und zu bestimmen, welche Steckdosen für Lese- und Schreibvorgänge bereit sind. Der Prototyp ist wie folgt:
int socket_select(array &$read, array &$write, array &$except, ?int $tv_sec, ?int $tv_usec = null)
$ Read : Hören Sie, ob es lesbar ist.
$ schreiben : Hören Sie, ob es beschreibbar ist oder nicht
$ außer : das Socket -Array, das Ausnahmen hört
$ TV_SEC und $ TV_USEC : Timeout (Sekunden und Mikrosekunden)
Die Funktionsblöcke, bis mindestens eine Buchse fertig ist oder eine Zeitüberschreitung auftritt, wodurch die Anzahl der Sockeln zurückgegeben wird.
In der tatsächlichen Serverentwicklung stehen wir häufig der Situation, in der mehrere Client -Verbindungen zur gleichen Zeit ankommen. Die Verwendung von Blockieren von Socket_accept kann nicht mehrere Verbindungen gleichzeitig verarbeiten, was problemlos zu Engpässen führen kann. Durch Socket_Select können wir:
Hören Sie sich mehrere Client -Verbindungen gleichzeitig an
Lesen Sie Daten rechtzeitig, wenn der Socket Daten hat, und blockiert die CPU nicht, wenn sie im Leerlauf ist
Implementieren Sie ein effizientes ereignisgesteuertes Modell
Das folgende Beispiel implementiert einen einfachen Chatroom -Server, der mehrere Client -Verbindungen unterstützt und Nachrichten an alle überträgt.
<?php
// erstellenTCP Socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, "0.0.0.0", 12345);
socket_listen($server);
$clients = [];
echo "Chatroom Server -Startup,Hören Sie sich Port an12345...\n";
while (true) {
// Bauen Sie ein Hörarray auf,Einschließlich Serversocketund alle Kundensocket
$readSockets = $clients;
$readSockets[] = $server;
// verwendensocket_selectWarten Sie auf die Lesbarkeitsocket
$write = $except = null;
$numChangedSockets = socket_select($readSockets, $write, $except, 0, 200000);
if ($numChangedSockets === false) {
echo "socket_select Ein Fehler ist aufgetreten\n";
break;
} elseif ($numChangedSockets > 0) {
// Hören Sie sich eine neue Verbindung an
if (in_array($server, $readSockets)) {
$newClient = socket_accept($server);
if ($newClient !== false) {
$clients[] = $newClient;
$welcomeMsg = "Willkommen im Chatraum!\n";
socket_write($newClient, $welcomeMsg, strlen($welcomeMsg));
echo "Treten Sie dem neuen Kunden bei,Aktuelle Verbindungsnummer:" . count($clients) . "\n";
}
// ausreadSocketsEingenommenserver socket,Wiederholte Verarbeitung verhindern
$key = array_search($server, $readSockets);
unset($readSockets[$key]);
}
// Verarbeiten von vom Client gesendeten Nachrichten
foreach ($readSockets as $sock) {
$data = @socket_read($sock, 2048, PHP_NORMAL_READ);
if ($data === false || $data === '') {
// Der Client schließt die Verbindung
$key = array_search($sock, $clients);
socket_close($sock);
unset($clients[$key]);
echo "Kundenentzündung,Aktuelle Verbindungsnummer:" . count($clients) . "\n";
continue;
}
$data = trim($data);
if ($data) {
echo "Eine Nachricht erhalten: $data\n";
// Meldungen an alle Clients übertragen
foreach ($clients as $client) {
if ($client != $sock) {
socket_write($client, "Ein Benutzer sagte: $data\n");
}
}
}
}
}
}
socket_close($server);
Der Server erstellt zunächst einen TCP -Socket, bindet den Port und hört die Verbindung an.
In der Hauptschleife enthält $ ReadSockets alle Client -Sockets und Server -Hörstecke.
Rufen Sie Socket_Select an, um darauf zu warten, dass ein Socket lesbar ist.
Wenn der Server -Socket lesbar ist, gibt es eine neue Verbindung, die der Client -Liste akzeptiert und hinzugefügt wird.
Wenn der Client -Socket lesbar ist, Daten liest, die Verbindung schließt, wenn sie leer sind und die Nachricht ansonsten überträgt.
Verwenden Sie eine nicht blockierende kurze Zeitüberschreitung von 0,2 Sekunden, um CPU-Leerlauf zu vermeiden.
Socket_Select ist der Schlüssel zum Multi-Connection-E/A-Multiplexing, wodurch das Blockieren und Verbesserung der Serverleistung vermieden wird.
Die gleichzeitige Verarbeitung mit mehreren Klaren kann einfach mit Socket_Select implementiert werden.
Geeignet für Chatrooms, Online -Spiele, Instant Messaging und andere Szenarien für Netzwerkanwendungen.
Wenn Sie detailliertere Tutorials und Fälle zur PHP-Netzwerkprogrammierung wissen möchten, können Sie besuchen: http://gitbox.net/php-network-tutorial