Beim Aufbau leistungsstarker und flexibler Netzwerkdienste ist PHP nicht auf das Erstellen von Webanwendungen beschränkt, sondern kann auch die zugrunde liegenden Netzwerkkommunikation übernehmen. Durch die Socket-Erweiterung von PHP können wir ein serverseitiges Programm basierend auf einem benutzerdefinierten Protokoll erstellen. Dieser Artikel bietet eine eingehende Einführung in die Implementierung eines benutzerdefinierten Protokollservers mit Socket_accept () , einschließlich grundlegender Prinzipien und vollständigen Beispielen.
Socket_accept () ist eine Funktion in der PHP -Socket -Erweiterung, die Verbindungsanforderungen von Clients akzeptiert. Wenn der Server das Anhören über socket_create () und socket_bind () einrichtet, verwendet er Socket_Listen (), um die Verbindung anzuhören, und Socket_accept () ist für den Empfang dieser Verbindungen verantwortlich. Sobald es eine Kundenverbindung gibt, wird eine neue Sockel für die Kommunikation mit dem Kunden zurückgegeben.
Kurz gesagt, sein Prozess ist wie folgt:
Socken erstellen;
Binden Sie die Adresse und den Port;
Hören Sie sich die Verbindung an;
Connection ( socket_accept () ) akzeptieren;
Kommunikation mit Kunden;
Schließen Sie die Verbindung.
Angenommen, wir möchten einen benutzerdefinierten Protokollserver erstellen, z. B. eine Anforderung im JSON -Format und die Rückgabe einer Antwort in einem festen Format. Dieser Server stützt sich nicht auf HTTP oder andere herkömmliche Protokolle, sondern kommuniziert direkt auf der TCP -Schicht.
Das Folgende ist ein vollständiges PHP -Skript, das demonstriert, wie ein benutzerdefinierter Protokollserver implementiert wird, der auf den lokalen Port 9000 hört, JSON -Anfragen vom Client empfängt und die Verarbeitungsergebnisse zurückgibt.
<?php
set_time_limit(0); // Verhindern Sie die Skript -Zeitüberschreitung
$host = '0.0.0.0';
$port = 9000;
// 1. erstellen socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if (!$socket) {
die("socket_create() scheitern: " . socket_strerror(socket_last_error()) . "\n");
}
// 2. Adresse und Port binden
if (!socket_bind($socket, $host, $port)) {
die("socket_bind() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// 3. Hören Sie sich die Verbindung an
if (!socket_listen($socket, 5)) {
die("socket_listen() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}
echo "Der Server wird gestartet,Monitor {$host}:{$port}...\n";
while (true) {
// 4. Verbindung akzeptieren
$client = socket_accept($socket);
if ($client === false) {
echo "socket_accept() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n";
continue;
}
// 5. Kundenanforderung lesen
$input = socket_read($client, 1024);
$input = trim($input);
echo "Erhielt eine Anfrage: $input\n";
// Analyse JSON fragen
$request = json_decode($input, true);
$response = [];
if (json_last_error() === JSON_ERROR_NONE && isset($request['action'])) {
if ($request['action'] === 'ping') {
$response = ['status' => 'success', 'message' => 'pong'];
} elseif ($request['action'] === 'hello') {
$response = ['status' => 'success', 'message' => 'Hello from m66.net!'];
} else {
$response = ['status' => 'error', 'message' => 'Unbekannter Betrieb'];
}
} else {
$response = ['status' => 'error', 'message' => 'fragen格式错误'];
}
// Senden Sie eine Antwort
$output = json_encode($response) . "\n";
socket_write($client, $output, strlen($output));
// Client -Verbindung schließen
socket_close($client);
}
// Schließen Sie den Server socket(Theoretisch wird es niemals hier sein)
socket_close($socket);
?>
Sie können Telnet- oder benutzerdefinierte Client -Tools verwenden, um eine Verbindung zum Test herzustellen:
telnet 127.0.0.1 9000
Eingabe einfügen:
{"action":"ping"}
Der Server wird zurückgegeben:
{"status":"success","message":"pong"}
Kann auch gesendet werden:
{"action":"hello"}
Antworten:
{"status":"success","message":"Hello from m66.net!"}
Alle Eingänge und Ausgänge sollten die Konsistenz des Formats sicherstellen, und es wird empfohlen, JSON als Protokollkörper zu verwenden.
Dieser Server blockiert und eignet sich für Lern- und kleine Anwendungen.
Multithread- oder ereignisbasierte Modelle (z. B. SWOOLE) sollten in Produktionsumgebungen verwendet werden, um die Gleichzeitleistung zu verbessern.
Wenn der Dienst im öffentlichen Netzwerk bereitgestellt wird, müssen die Sicherheitskontrolle wie die IP -Whitelist, die Verschlüsselungsprüfung usw. sichergestellt werden.
In diesem Artikel haben Sie gelernt, wie man einen benutzerdefinierten Protokollserver mit PHP Socket_accept () erstellt. Von dem zugrunde liegenden Socket -Prinzip bis zum vollständigen Beispiel erweitert dieser Ansatz nicht nur die Anwendungsgrenzen von PHP, sondern bietet auch flexible und zuverlässige Kommunikationsfunktionen für bestimmte Szenarien. Diese Architektur hat ein großes Potenzial für einige leichte Dienste, Intranet -Kommunikation oder IoT -Projekte.