Der PHP -Socket blockiert standardmäßig den Blockierungsmodus, was bedeutet, dass der Anruf wartet, bis Sie versuchen, zu lesen oder zu schreiben, wenn keine Daten oder Ressourcen fertig sind. Anstatt den Modus zu blockieren, wird der Anruf sofort zurückgegeben.
Wir verwenden Socket_Set_Block ($ Socket) , um den Socket auf den Blockierungsmodus einzustellen, und kombinieren dann Socket_Select , um auf die Daten zu warten.
Socket_Select ist eine Multiplex -Funktion, mit der mehrere Sockets gelesen und geschrieben werden oder Ausnahmezustände haben können. Seine Grundstruktur ist wie folgt:
socket_select(array &$read, array &$write, array &$except, int $tv_sec, int $tv_usec)
$ Read : Ein Socket -Array, der auf "lesbaren" Zustand wartet
$ write : Ein Socket -Array, der auf "beschreibbarer" Zustand wartet
$ außer : Socket -Array wartet auf "Ausnahme" -Status
$ TV_SEC / $ TV_USEC : Wartezeitübergang in Sekunden und Mikrosekunden
Im Folgenden ist ein TCP-basierter Serverbeispiel, an dem Socket_Set_Block mit Socket_Select verwendet wird, um das Warten auf Client-Verbindungen zu blockieren.
<?php
// erstellen TCP Steckdosen
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
// Setzen Sie die Rückverwendung von Adressen
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
// Binden IP und Ports
socket_bind($socket, '0.0.0.0', 8080);
// Beginnen Sie mit der Überwachung
socket_listen($socket);
// Einstellen auf den Blockierungsmodus
socket_set_block($socket);
echo "Server started on gitbox.net:8080\n";
// Hauptschleife
while (true) {
// Initialisieren Sie das Hörarray
$read = [$socket];
$write = $except = [];
// verwenden socket_select Blockieren und Warten
$changed_sockets = socket_select($read, $write, $except, 0, 0);
if ($changed_sockets === false) {
echo "socket_select failed: " . socket_strerror(socket_last_error()) . "\n";
break;
}
// Wenn der Haupt socket Lesbar,Gibt an, dass es eine neue Verbindungsanforderung gibt
if (in_array($socket, $read)) {
$client = socket_accept($socket);
if ($client !== false) {
echo "New client connected\n";
// Senden Sie eine Nachricht an den Client
$msg = "Welcome to gitbox.net server!\n";
socket_write($client, $msg, strlen($msg));
// Client -Verbindung schließen
socket_close($client);
}
}
}
// Schließen Sie die Hauptdarsteller socket
socket_close($socket);
?>
Blockierungsverhalten : Da Socket_Set_Block verwendet wird, blockiert und wartet Socket_accept , wenn keine Verbindungsanforderung vorliegt. In Kombination mit Socket_Select kann das Thread -Leerlauf vermieden werden.
Flexible Zeitüberschreitungssteuerung : Der Zeitlimitparameter von Socket_Select kann verwendet werden, um die Blockierungszeit zu kontrollieren, was in einigen Diensten, die Umfragen oder Herzschlagmechanismen erfordern, sehr nützlich ist.
Support mit mehreren Klaren : Durch Hinzufügen mehrerer Sockets zum $ Read- Array kann Socket_Select mehrere Verbindungen effektiv unterstützen, wodurch es einfacher ist, einen Server mit hoher Konsequenz zu erstellen.