Aktueller Standort: Startseite> Neueste Artikel> Wie verwende ich Stream_get_filter, um einen Stream -Filter für große Dateien auszuwählen?

Wie verwende ich Stream_get_filter, um einen Stream -Filter für große Dateien auszuwählen?

gitbox 2025-05-20

In PHP sind Stream -Filter leistungsstarke Tools, mit denen Daten in Echtzeit verarbeitet werden können, wenn Streams wie Komprimierung, Verschlüsselung, Codierung oder Ersatz für Inhalte geschrieben werden. Wenn wir mit großen Dateien arbeiten, reduziert die Verwendung des richtigen Stream -Filters nicht nur den Speicherverbrauch, sondern verbessert auch die Verarbeitungseffizienz.

In diesem Artikel wird erläutert, wie die Funktion stream_get_filter verwendet wird, um die verfügbaren Stream -Filter im System aufzulisten und Filter auszuwählen, die für große Dateiverarbeitung basierend auf den Anforderungen geeignet sind.

1 ?? Was ist stream_get_filters

Stream_get_filters () ist eine integrierte Funktion, die alle Stream-Filter in der aktuellen PHP-Umgebung registriert erhält. Sein Anruf ist sehr einfach:

 $filters = stream_get_filters();
print_r($filters);

Dies gibt eine Array -Auflistung der verfügbaren Filter zurück, beispielsweise:

 Array
(
    [0] => zlib.inflate
    [1] => zlib.deflate
    [2] => string.rot13
    [3] => string.toupper
    [4] => string.tolower
    [5] => convert.iconv.*
)

In:

  • Zlib.inflate / zlib.deflate → Für Komprimierung und Dekompression (geeignet für eine große Dateikomprimierungsübertragung).

  • Convert.iconv.* → Für die Charaktercodierungsumwandlung.

  • Zeichenfolge.* → Einfache Zeichenfolge (normalerweise nicht für große Dateien geeignet, da sie block für Blockvorgänge sind, nicht für Streaming-Optimierung).

2 ?? So wählen Sie einen Filter, der für große Dateien geeignet ist

Für eine große Dateiverarbeitung konzentrieren wir uns normalerweise auf zwei Arten von Filtern:
? Kompressionsklasse (ZLIB) : Kann das Lesen und Schreiben des Bandes reduzieren.
? Coding Conversion Class (ICONV) : Streaming Conversion -Zeichen -Codierung, geeignet für große Textdateien.

Beispiel: Komprimieren Sie einen großen Dateiinhalt und schreiben Sie eine neue Datei

 $source = 'large_input.txt';
$destination = 'large_output.gz';

// Open Source -Datei
$in = fopen($source, 'rb');
// Öffnen Sie die Zieldatei und beibringen zlib.deflate Kompressionsfilter
$out = fopen('compress.zlib://' . $destination, 'wb');

if (!$in || !$out) {
    die('Die Datei kann nicht geöffnet werden');
}

while (!feof($in)) {
    $buffer = fread($in, 8192);
    fwrite($out, $buffer);
}

fclose($in);
fclose($out);

echo "Die Datei wurde komprimiert und gespeichert als $destination\n";

Beachten Sie die hier verwendete compress.zlib: // Protokoll. Tatsächlich verwendet die zugrunde liegende Schicht den Zlib.Deflate -Filter.

3 ?? Dynamisch Filter in Kombination mit Stream_filter_Append anwenden

Manchmal möchten Sie keine Protokollwrapper verwenden, aber dynamisch Filter zu vorhandenen Streams hinzufügen. Sie können Stream_filter_Append verwenden:

 $fp = fopen('output.txt', 'wb');
$filter = stream_filter_append($fp, 'string.toupper', STREAM_FILTER_WRITE);

fwrite($fp, 'Hello gitbox.net!');
fclose($fp);

// output.txt Generalleutnant schreibt HELLO GITBOX.NET!

Vermeiden Sie für große Dateien zu viele Filter der String -Serie, da sie nicht unbedingt für die Leistung optimiert sind. Es wird empfohlen, Filtern, die speziell für die Streaming -Verarbeitung ausgelegt sind, Priorität zu geben, z. B. ZLIB , BZIP2 , ICONV .

4 ?? Filter auflisten und erkennen

Wenn Sie nicht sicher sind, welche Filter verfügbar sind, können Sie dies erkennen:

 $availableFilters = stream_get_filters();
$needed = ['zlib.deflate', 'convert.iconv.utf-8/cp1251'];

foreach ($needed as $filter) {
    $found = false;
    foreach ($availableFilters as $available) {
        if (stripos($available, $filter) !== false) {
            $found = true;
            break;
        }
    }
    echo $filter . ': ' . ($found ? 'Verfügbar' : '不Verfügbar') . "\n";
}