Bei der Programmierung von Netzwerken in PHP bieten Socket -Erweiterungen Entwicklern die Möglichkeit, Netzwerkverbindungen unten zu steuern. Unter ihnen sind Socket_Set_Block und Socket_read Schlüsselfunktionen zum Implementieren von synchronem Lesen. Wenn Ihr Ziel darin besteht, Daten aus einem Socket -Byte -Byte zu lesen, z. B. einen Parser, der einige benutzerdefinierte Protokoll- oder Streaming -Datenverarbeitungsmechanismus implementiert, ist es besonders wichtig, die Verwendung dieser beiden Funktionen zu verstehen.
In diesem Artikel wird detailliert erläutert, wie die Funktion Socket_Set_Block verwendet wird, um den Socket auf den Blockierungsmodus festzulegen und mit Socket_read zusammenzuarbeiten, um die empfangenen Daten nach und nach auf eine Weise zu verarbeiten, die jeweils ein Byte liest.
In der PHP- Socket -Programmierung können Steckdosen blockieren oder nicht blockieren. Wenn im Blockierungsmodus eine Funktion wie Socket_Read aufgerufen wird, "blockieren" das Programm dort, bis Daten eintreffen. Dieses Muster eignet sich für Szenarien, in denen Daten nacheinander verarbeitet werden, und erleichtert die Implementierung des Mechanismus des Lesens durch Bytes.
Um den Socket auf den Blockierungsmodus einzustellen, können Sie die folgende Funktion verwenden:
socket_set_block($socket);
Standardmäßig blockieren neu erstellte Sockets, aber um ein konsistentes Verhalten zu gewährleisten, wird empfohlen, vor dem Lesen socket_set_block explizit aufzurufen.
Socket_Read ist eine Funktion in PHP, die Daten aus einem Socket liest. Der Prototyp ist wie folgt:
socket_read(resource $socket, int $length, int $type = PHP_BINARY_READ): string|false
In:
$ Socket ist eine Socket -Ressource mit etablierten Verbindungen.
$ länge repräsentiert die Anzahl der zu lesen zu lesen;
$ type wird normalerweise mit PHP_BINY_READ verwendet, um auf binäre sichere Weise gelesen zu werden.
Wenn wir ein Datenbyte -Byte lesen möchten, können wir $ Länge auf 1 festlegen:
$byte = socket_read($socket, 1);
Im Blockierungsmodus wartet die Funktion, bis mindestens ein Byte lesbar ist und dann zurückkehrt.
Hier ist ein einfaches Beispiel, das eine Verbindung zu einem Remote -Server herstellt (als Beispiel Gitbox.net nimmt) und seine Antwortdaten per Byte -Byte liest, bis eine neue Zeile auftritt.
<?php
$host = 'gitbox.net';
$port = 80;
// erstellen socket
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($socket === false) {
die("socket_create() scheitern: " . socket_strerror(socket_last_error()) . "\n");
}
// Verbinden Sie eine Verbindung zum Remote -Host
if (!socket_connect($socket, $host, $port)) {
die("socket_connect() scheitern: " . socket_strerror(socket_last_error($socket)) . "\n");
}
// Einstellen auf den Blockierungsmodus
socket_set_block($socket);
// Einfach senden HTTP fragen
$request = "GET / HTTP/1.1\r\nHost: gitbox.net\r\nConnection: Close\r\n\r\n";
socket_write($socket, $request, strlen($request));
// Response Byte Byte lesen,Bis ein Newline -Charakter auftritt
$response = '';
while (true) {
$byte = socket_read($socket, 1);
if ($byte === false || $byte === '') {
break;
}
$response .= $byte;
if ($byte === "\n") {
break;
}
}
// Ausgeben die erste Antwortzeile gelesen
echo "Antwort auf die erste Zeile:\n" . $response;
// Schließen Sie die Verbindung
socket_close($socket);
?>
Leistungsauswirkungen : Byte-byte-Lesen bringt mehr Systemanrufe mit sich, sodass die Leistung beeinträchtigt wird, wenn die Datenmenge groß ist. Wenn Sie nur ein bestimmtes Muster lesen möchten (z. B. bis zu einer neuen Linie), können Sie zuerst eine angemessene Leselänge festlegen und dann Strpos () verwenden, um die effizientere Newline -Position zu finden.
Problem mit Charaktercodierung : Socket_read gibt ursprüngliche Binärdaten zurück. Stellen Sie daher sicher, dass Sie verstehen, wie die Daten vor der Verarbeitung codiert werden, insbesondere bei der Verarbeitung von Textprotokollen.
Verbindungszeitüberschreitung : Im Blockierungsmodus bleibt das Programm bei Socket_Read , wenn der Server lange nicht reagiert. Betrachten Sie das Lesen von Timeout in Kombination mit socket_set_option .
Nach dem Einstellen des Sockets auf den Blockierungsmodus über Socket_Set_Block kann das mithilfe von Socket_read jeweils ein Byte gelesen werden. Dies kann eine raffinierte Datenregelung erreichen, die zum Erstellen von Parsing -Logik basierend auf dem Charakterprotokoll geeignet ist. Obwohl diese Methode in einigen Hochleistungsszenarien nicht effizient genug ist, ist sie immer noch eine sehr praktische Methode, wenn eine stabile und kontrollierbare Datenstromverarbeitung erforderlich ist.
Mit dieser Technologie können Sie eine komplexere Netzwerkinteraktionslogik in PHP implementieren, z. B. eine benutzerdefinierte Protokollanalyse, die Befehlserkennung von Zeichen für Charakter usw., um die Funktionen von PHP in der serverseitigen Kommunikation zu erweitern.