Bei der Verwendung von PHP zur Entwicklung von Socket-basierten Netzwerkanwendungen kommen Entwickler häufig mit den beiden Funktionen in Kontakt: socket_accept () und socket_set_block () . Obwohl beide Funktionen zu Erweiterungen von PHP -Sockel gehören, sind sie eng mit ihrer Verwendung verbunden. Das Verständnis ihres kollaborativen Arbeitsmechanismus hilft uns dabei, das Verhalten von Sockets genauer zu kontrollieren und die Zuverlässigkeit und Effizienz der Netzwerkkommunikation zu verbessern.
Bevor Sie die Zusammenarbeit dieser beiden Funktionen untersuchen, verstehen wir zunächst ihre grundlegenden Funktionen:
Socket_accept (Ressource $ Socket): Ressource | Falsch
Diese Funktion wird verwendet, um eine Verbindungsanforderung aus der Hörstecke zu akzeptieren. Wenn es keine Verbindungsanforderung gibt, hängt sein Verhalten vom Blockierungsmuster der Sockel ab.
SOCKKET_SET_BLOCK (Ressource $ Socket): bool
Diese Funktion setzt einen Socket in den Blockierungsmodus. Im Blockierungsmodus warten verwandte Socket -Operationen (wie Socket_accept , Socket_read usw.), bis Daten oder Verbindung auftreten.
Das Gegenteil von socket_set_block () ist socket_set_nonblock () , wodurch der Socket -Betrieb sofort zurückgeht, unabhängig davon, ob Daten oder Verbindung vorhanden sind.
Standardmäßig sind von PHP erstellte Sockets im Blockierungsmodus, was bedeutet, dass Socket_accept () blockiert und wartet, bis eine Client -Verbindung besteht. Das heißt, wenn Sie den folgenden Code ausführen:
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 12345);
socket_listen($socket);
$client = socket_accept($socket);
echo "Connection accepted";
Ohne Client -Verbindung bleibt das Programm beim Aufruf von Socket_accept () , bis eine Verbindung auftritt.
Jetzt stellen wir Socket_Set_Block () ein und setzen Socket explizit in den Blockierungsmodus (obwohl er standardmäßig blockiert, können explizite Einstellungen verhindern, dass der Code aufgrund früherer Vorgänge, die den Modus geändert haben, erfüllen):
<?php
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_block($socket); // Explizit auf den Blockierungsmodus eingestellt
socket_bind($socket, '0.0.0.0', 12345);
socket_listen($socket);
$client = socket_accept($socket);
echo "Connection accepted";
An diesem Punkt ändert sich das Verhalten von Socket_accept () nicht: Es blockiert immer noch, bis eine Client -Verbindung besteht.
Aber wenn wir hier socket_set_nonblock () verwenden:
socket_set_nonblock($socket);
Wenn dann Socket_accept () aufgerufen wird, gibt es bei keiner Verbindungsanforderung falsch zurück, und Socket_Last_error () kann überprüft werden, ob es an Eagain oder EWOUDBLOCK liegt, wodurch die Logik des nicht blockierenden Empfangs von Verbindungen implementiert wird.
Die Zusammenarbeit zwischen Socket_Set_Block () und Socket_accept () wird im Wesentlichen durch Festlegen des Arbeitsmodus von Socket bestimmt, um das Blockierungsverhalten von Socket_accept () zu bestimmen. Diese Einstellung bestimmt, ob der Steuerfluss des Programms synchron (blockiert) oder asynchron (nicht blockiert) ist.
Wenn Sie beispielsweise Hochleistungsserver schreiben, können Sie einen nicht blockierenden Socket verwenden und Socket_Select () kombinieren, um auf mehrere Verbindungsanforderungen zu hören:
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_nonblock($socket);
socket_bind($socket, '0.0.0.0', 12345);
socket_listen($socket);
$clients = [];
while (true) {
$read = [$socket];
$write = $except = null;
if (socket_select($read, $write, $except, 1) > 0) {
$client = socket_accept($socket);
if ($client !== false) {
$clients[] = $client;
echo "Client connected\n";
}
}
// Andere Logik bewältigen
}
Mit dieser Methode können Sie mehrere Sockets gleichzeitig in einer Schleife verarbeiten, ohne auf Socket_accept () zu blockieren und zu warten.
Socket_Set_Block () bestimmt, ob Socket -Blöcke funktionieren, und Socket_accept () ist eine spezifische Operation, die von dieser Einstellung betroffen ist. Wenn der Socket den Blockierungsmodus blockiert, wartet Socket_accept () auf die Verbindung. Im Nichtblocking-Modus kehrt es sofort zurück. Die kollaborative Verwendung der beiden ermöglicht es uns, synchrone oder asynchrone Netzwerkdienstprogramme entsprechend den tatsächlichen Anforderungen zu schreiben und eine größere Flexibilität zu bieten.
Das Verständnis ihrer Beziehung hilft nicht nur dabei, stabile Socket-Dienste zu schreiben, sondern bildet auch die Grundlage für den Aufbau von Netzwerken mit hoher Konzriktion und Niedrigbindungsnetzwerk.
Weitere verwandte Beispiele finden Sie unter https://gitbox.net/socket-examples .