In PHP ist Stream eine einheitliche Schnittstelle für die Verarbeitung von Ressourcen wie Dateien, Netzwerken und Speicher. Der effiziente Betriebsfluss ist entscheidend für die Verbesserung der Gesamtleistung des Programms. Dieser Artikel konzentriert sich auf zwei häufig verwendete, aber oft übersehene Funktionen: Stream_Get_Filters und Stream_Set_Blocking und untersuchen, wie die Effizienz von Stream -Operationen durch sie optimiert werden.
Die Funktion Stream_get_filters wird verwendet, um die aktuell verfügbare Liste der Stream -Filter zu erhalten. Ein Stream -Filter ist ein Mechanismus zum dynamischen Ändern von Daten beim Lesen oder Schreiben, z. B. Komprimieren, Verschlüsseln oder Codierung der Daten.
Beispielcode:
<?php
$filters = stream_get_filters();
print_r($filters);
?>
Die Ausgabe kann sein:
Array
(
[0] => string.rot13
[1] => string.toupper
[2] => string.tolower
[3] => convert.iconv.*
[4] => zlib.*
)
Durch die Verwendung dieser Filter können Sie Daten während des Lesens und Schreibens des Streams automatisch verarbeiten, ohne den PHP -Code manuell verarbeiten zu müssen. Dies kann die CPU -Verarbeitungsaufwand nach E/A -Operationen erheblich reduzieren.
<?php
$fp = fopen('compress.zlib://example.txt.gz', 'w');
fwrite($fp, 'Hello, Gitbox!');
fclose($fp);
?>
Hier verwenden wir den ZLIB -Filter, um die Datei direkt zu komprimieren, ohne zuerst in die Datei zu schreiben und dann mit GZCompress zu verarbeiten.
Die Funktion Stream_set_Blocking wird verwendet, um den Blockier- oder Nicht-Blocking-Modus des Streams zu wechseln. Standardmäßig blockiert der Stream, dh der PHP -Code wartet, bis die E/A -Operation abgeschlossen ist, bevor die Ausführung fortgesetzt wird.
Durch den Nicht-Blocking-Modus kann der Code weiterhin andere Aufgaben verarbeiten und auf die E/A warten, z. B.:
Umfehle mehrere Stream -Eingänge (wie Steckdosen)
Verbesserung der Reaktionsfähigkeit, insbesondere in Szenarien, in denen die Netzwerklatenz unkontrollierbar ist
Beispielcode:
<?php
$fp = fopen('http://gitbox.net/data', 'r');
stream_set_blocking($fp, false);
while (!feof($fp)) {
$data = fread($fp, 1024);
if ($data) {
echo $data;
}
// Andere Verarbeitungslogik,Kann ausgeführt werden, während sie auf Daten warten
usleep(100000); // Simulationsverarbeitungsverzögerung
}
fclose($fp);
?>
Durch den nicht blockierenden Modus kann das Programm vermeiden, lange Zeit im Netzwerk zu stecken, wodurch der Gesamtdurchsatz erheblich verbessert wird.
Manuelle Datenverarbeitung reduzieren: Verwenden Sie integrierte Filter, die von Stream_get_filters anstelle von handgeschriebenen Komprimierung, Verschlüsselung oder Formatierungscode bereitgestellt werden.
Vermeiden Sie Blockierung und Warten: Für Netzwerkströme, Pipelines, Sockets usw. Verwenden Sie Stream_Set_Blocking mit Ereignisabfragen oder asynchronem Modell, um CPU -Leerlauf zu vermeiden.
In Kombination mit Stream Selector: Mit Stream_Select können Sie gleichzeitig mehrere Streams anhören und die Wartezeit weiter verkürzen.