Durch die Implementierung eines Socket-basierten Blockierungsservers in PHP können wir das zugrunde liegende Netzwerkkommunikationsprinzip verstehen. Der Blockierungsmodus bedeutet, dass der Server wartet, bis die Daten gelesen oder geschrieben werden, bis Daten verarbeitet werden oder die Verbindung fertig ist. In diesem Artikel wird Schritt für Schritt analysiert, wie die Socket -Erweiterung von PHP verwendet wird, vom Erstellen von Sockets bis hin zum Einstellen im Blockierungsmodus und einem einfachen Blockierungsserver.
Stellen Sie zunächst sicher, dass die Socket -Erweiterung in der PHP -Umgebung aktiviert ist. Finden und mit der folgenden Zeile in Php.ini (falls vorhanden):
extension=sockets
Verwenden Sie den Befehl PHP -M, um zu überprüfen, ob die Erweiterung aktiviert ist:
php -m | grep sockets
Wenn Sie Sockets sehen können, ist die Erweiterung aktiviert.
Im Folgenden sind die grundlegenden Schritte zum Erstellen einer Socket und Schritt für Schritt die Rolle jeder Funktion ein.
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() failed: " . socket_strerror(socket_last_error()) . "\n");
}
Hier erstellen wir eine TCP -Socket ( SOCK_Stream ) basierend auf IPv4 ( AF_Inet ).
Einige Socket -Optionen können festgelegt werden, z. B. die Wiederverwendung von Port:
socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
$host = '0.0.0.0';
$port = 9000;
if (!socket_bind($socket, $host, $port)) {
die("socket_bind() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
if (!socket_listen($socket, 5)) {
die("socket_listen() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
5 gibt die maximale Anzahl an ausstehender Verbindungsanforderungen an.
Verwenden Sie Socket_Set_Block , um den Socket auf den Blockierungsmodus zu setzen.
if (!socket_set_block($socket)) {
die("socket_set_block() failed: " . socket_strerror(socket_last_error($socket)) . "\n");
}
Sobald der Blockierungsmodus eingestellt ist, blockieren nachfolgende Socket_accept , Socket_read und andere Funktionen, bis der Betrieb abgeschlossen ist.
echo "Der Server wird gestartet,Hören Sie sich Port an $port...\n";
while (true) {
$clientSocket = socket_accept($socket);
if ($clientSocket === false) {
echo "socket_accept() failed: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
$input = socket_read($clientSocket, 1024);
if ($input === false) {
echo "socket_read() failed: " . socket_strerror(socket_last_error($clientSocket)) . "\n";
} else {
$input = trim($input);
echo "Eine Nachricht erhalten: $input\n";
$response = "Du hast es geschickt:$input\n";
socket_write($clientSocket, $response, strlen($response));
}
socket_close($clientSocket);
}
Vergessen Sie nicht, den Hauptbuchsen zu schließen, wenn Sie beenden müssen:
socket_close($socket);
Sie können einen Befehlszeilen -Client wie den Telnet -Verbindungstest verwenden:
telnet gitbox.net 9000
Oder schreiben Sie einen einfachen PHP -Client für Verbindungstests.
Von Socket_Create an socket_set_block erstellen wir einen vollständigen Blockierserver. Dieser Modus eignet sich für einfache Netzwerkkommunikationsanwendungen wie Unterricht, Debugging oder Szenarien mit geringer Konsequenz. Bei hohen Parallelitätsszenarien wird empfohlen, den nicht blockierenden Modus zu verwenden oder Select / Poll zu verwenden, um effizientere Ereignisschleifen zu erreichen.
Durch die praktischen Schritte in diesem Artikel können Sie den gesamten Prozess des Erstellens von Blockierungsservern in PHP beherrschen und eine solide Grundlage für eine weitere eingehende Netzwerkprogrammierung legen.