Bei der PHP -Netzwerkprogrammierung ist die Handhabung von Multiplexing eine Schlüsseltechnologie für effiziente Netzwerkdienste. SOCKKET_SET_OPTION UND SOCKET_SELECT sind zwei wichtige Funktionen in der PHP -Socket -Programmierung. Viele Entwickler werden sich fragen, ob sie zusammen verwendet werden können, insbesondere wie sie bei der Implementierung von Multiplexen richtig übereinstimmen können.
Dieser Artikel erläutert ausführlich die Rolle von Socket_Set_Option und Socket_Select , diskutiert, ob sie zusammen verwendet werden können, und stellen vor, wie sie verwendet werden, um Multiplexing zu erreichen.
Socket_Set_Option wird verwendet, um Optionen für Steckdosen festzulegen, z. B. die Zeitüberschreitungszeit, ob die Adresse wiederverwendet, Puffergröße gesendet/empfangen usw. Seine Funktion besteht darin, die Verhaltensmerkmale der Socket anzupassen.
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
Der oben genannte Code legt die Option zur Wiederverwendung von Adressen für Socket fest.
Socket_Select ist eine Schlüsselfunktion zum Implementieren von Multiplexing. Es wird verwendet, um auf mehrere Steckdosen zu hören, und wenn eine oder mehrere der Steckdosen bereit sind zu lesen und zu schreiben, kehrt die Funktion zurück. Dies ermöglicht es einem Einzelprogramm, mehrere Verbindungen gleichzeitig zu verarbeiten.
$read = [$socket1, $socket2];
$write = null;
$except = null;
$timeout = 5;
$num_changed = socket_select($read, $write, $except, $timeout);
Socket_Select gibt die vorbereiteten Sockets zurück, indem sie $ read , $ write und $ außer Arrays geändert werden.
Die Antwort lautet ja , aber die Funktionen der beiden sind unterschiedlich. Wenn Sie zusammen verwendet werden, sollten Sie die Verwendungen klar unterscheiden:
Socket_Set_Option wird verwendet, um das Socket -Verhalten (z. B. Zeitüberschreitungen, Puffer usw.) zu konfigurieren.
Socket_Select wird verwendet, um zu hören, ob mehrere Sockets lesbar, beschreibbar sind oder Ausnahmen haben.
Multiplexing basiert hauptsächlich auf Socket_Select , während Socket_Set_Option nur die Eigenschaften von Socket anpasst, normalerweise eingestellt nach der Erstellung von Socket und bevor Socket_Select verwendet wird.
Das Folgende ist ein einfaches Serverbeispiel, das zeigt, wie Socket -Optionen mit socket_set_option festgelegt werden, während Socket_Select zum Multiplex -Multiplex -Listen für mehrere Client -Verbindungen verwendet wird.
<?php
// erstellen TCP socket
$server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);
// Binden Sie Port
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);
$clients = [];
$read = [$server];
while (true) {
$readSockets = $read;
$write = null;
$except = null;
// Hören Sie sich mehrere an socket Änderungen
$numChanged = socket_select($readSockets, $write, $except, 5);
if ($numChanged === false) {
echo "socket_select Es ist ein Fehler aufgetreten\n";
break;
} elseif ($numChanged > 0) {
// Hören Sie sich eine neue Client -Verbindung an
if (in_array($server, $readSockets)) {
$newClient = socket_accept($server);
if ($newClient !== false) {
socket_set_option($newClient, SOL_SOCKET, SO_RCVTIMEO, ["sec"=>5, "usec"=>0]);
$clients[] = $newClient;
$read[] = $newClient;
echo "Neue Client -Verbindung\n";
}
unset($readSockets[array_search($server, $readSockets)]);
}
// Prozessdaten von vorhandenen Clients gesendet
foreach ($readSockets as $socket) {
$data = socket_read($socket, 1024, PHP_NORMAL_READ);
if ($data === false || $data === '') {
// Verbindung schließt
socket_close($socket);
unset($clients[array_search($socket, $clients)]);
unset($read[array_search($socket, $read)]);
echo "Kunden getrennt\n";
} else {
$data = trim($data);
echo "Empfangene Clientdaten: $data\n";
// Senden Sie eine Antwort
socket_write($socket, "Der Server wurde empfangen: $data\n");
}
}
}
}
socket_close($server);
Schlüsselpunkte Beschreibung:
Der Server -Socket $ Server legt SO_Reuseaddr mit socket_set_option fest, um eine schnelle Wiederverwendung zu gewährleisten.
Nachdem die neue Client -Verbindung hergestellt wurde, wird auch die Option "Empfangszeitleiter" mit socket_set_option festgelegt.
Socket_Select hört alle aktiven Client -Sockets und Server -Sockets zu, um sicherzustellen, dass der Multiplexing -Mechanismus ordnungsgemäß funktioniert.
Socket_Set_Option und Socket_Select -Funktionen sind unterschiedlich, können und sollten in Kombination verwendet werden.
SOCKKET_SET_OPTION ist für die Konfiguration von Socket -Parametern und zur Optimierung der Netzwerkleistung und des Verhaltens verantwortlich.
Socket_Select ist für Multiplexing und Lernen für mehrere Socket -Ereignisse verantwortlich.
Die Verwendung dieser beiden Funktionen kann vernünftigerweise effiziente und stabile Netzwerkserverprogramme schreiben.
Wenn Sie eingehend mit PHP -Socket -Multiplexen lernen möchten, können Sie sich auch auf offizielle Dokumente und verwandte Netzwerkprogrammierbücher verweisen, um weitere Details und erweiterte Fähigkeiten zu beherrschen.
Der URL -Domänenname für das Beispiel im Artikel lautet wie folgt:
$url = "https://gitbox.net/api/socket_demo";