Position actuelle: Accueil> Derniers articles> Comment utiliser Stream_get_Filters pour sélectionner un filtre de flux pour les fichiers volumineux?

Comment utiliser Stream_get_Filters pour sélectionner un filtre de flux pour les fichiers volumineux?

gitbox 2025-05-20

Dans PHP, les filtres de flux sont des outils puissants qui peuvent traiter les données en temps réel lors de la lecture ou de l'écriture de flux, tels que la compression, le chiffrement, le codage ou le remplacement du contenu. Lorsque nous travaillons avec des fichiers volumineux, l'utilisation du filtre de flux droit réduit non seulement la consommation de mémoire, mais améliore également l'efficacité du traitement.

Cet article expliquera comment utiliser la fonction Stream_get_Filters pour répertorier les filtres de flux disponibles sur le système et sélectionner les filtres adaptés au traitement des fichiers importants en fonction des exigences.

1 ?? Qu'est-ce que Stream_get_Filters

Stream_get_Filters () est une fonction intégrée qui obtient tous les filtres de flux enregistrés dans l'environnement PHP actuel. Son appel est très simple:

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

Cela renvoie une liste de tableaux des filtres disponibles, par exemple:

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

dans:

  • zlib.inflate / zlib.deflate → Pour la compression et la décompression (adapté au transfert de compression de fichiers grand).

  • convert.iconv. * → Pour la conversion de codage de caractère.

  • String. * → Opérations de chaîne simples (généralement pas adaptées aux fichiers volumineux car ce sont des opérations bloc par bloc, et non une optimisation en streaming).

2 ?? Comment choisir un filtre adapté aux grands fichiers

Pour le traitement des fichiers importants, nous nous concentrons généralement sur deux types de filtres:
? Classe de compression (ZLIB) : peut réduire le volume de lecture et d'écriture du disque.
? Classe de conversion de codage (iconv) : Encodage de caractères de conversion en streaming, adapté aux grands fichiers texte.

Exemple: compressez un contenu de fichier important et écrivez un nouveau fichier

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

// Fichier open source
$in = fopen($source, 'rb');
// Ouvrez le fichier cible et joignez zlib.deflate Filtre à compression
$out = fopen('compress.zlib://' . $destination, 'wb');

if (!$in || !$out) {
    die('Impossible d'ouvrir le fichier');
}

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

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

echo "Le fichier a été compressé et enregistré comme $destination\n";

Notez le protocole compress.zlib: // utilisé ici. En fait, la couche sous-jacente utilise le filtre Zlib.Deflate .

3 ?? Appliquer dynamiquement des filtres en combinaison avec Stream_Filter_APPEND

Parfois, vous ne voulez pas utiliser un wrapper de protocole, mais ajouter dynamiquement des filtres aux flux existants, vous pouvez utiliser Stream_Filter_APPEND :

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

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

// output.txt Le lieutenant-général écrit HELLO GITBOX.NET!

Pour les fichiers volumineux, évitez trop de filtres de séries de chaînes, car ils ne sont pas nécessairement optimisés pour les performances. Il est recommandé de donner la priorité aux filtres spécialement conçus pour le traitement en streaming, tels que ZLIB , BZIP2 , iconv .

4 ?? Répertorier et détecter les filtres

Si vous ne savez pas quels filtres sont disponibles, vous pouvez détecter ceci:

 $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 ? 'Disponible' : '不Disponible') . "\n";
}