Dans PHP, Streams est un outil puissant pour gérer de grandes quantités de données. Les flux nous permettent de lire et d'écrire des données à la demande sans charger les données entières en mémoire à la fois. Deux fonctions de fonctionnement de flux couramment utilisées sont Stream_get_Filters et Stream_Copy_To_stream , qui sont utilisées pour obtenir des filtres de flux et copier des données de flux, respectivement. Cet article expliquera comment utiliser ces deux fonctions pour réaliser des opérations de streaming efficaces, en particulier lorsque vous traitez avec de grands fichiers ou des données réseau.
La fonction Stream_get_Filters est utilisée pour obtenir tous les filtres de flux enregistrés. Ces filtres peuvent traiter les données dans le flux, telles que la compression, le chiffrement, etc. Vous pouvez utiliser ces filtres pour modifier la façon dont les données du flux sont lues ou écrites pour réaliser des opérations de flux plus flexibles.
<?php
// Obtenez tous les filtres de flux enregistrés
$filters = stream_get_filters();
// Sortir tous les filtres de flux
echo "Filtre de flux enregistré:\n";
foreach ($filters as $filter) {
echo $filter . "\n";
}
?>
Exécutez le code ci-dessus et vous verrez une liste de tous les filtres de flux enregistrés dans le système. Ces filtres peuvent être appliqués dans les opérations de flux, tels que la décompression, le chiffrement et d'autres traitements des données de lecture.
La fonction Stream_Copy_To_Stream est utilisée pour copier les données d'un flux dans un autre flux. Cette fonction convient particulièrement aux opérations de fichiers ou aux demandes de réseau et est très utile lorsque vous devez copier efficacement les données. Il prend en charge la copie de gros fichiers ou la copie des données des flux de réseau vers des fichiers locaux.
<?php
// Fichiers open source et cible
$source = fopen('http://gitbox.net/sample.txt', 'r'); // Supposons qu'il s'agit d'un flux de réseau
$destination = fopen('local_copy.txt', 'w'); // Fichier cible
if ($source && $destination) {
// 复制数据到Fichier cible
$bytesCopied = stream_copy_to_stream($source, $destination);
echo "Copier avec succès $bytesCopied Données d'octets。\n";
// Fermer le ruisseau
fclose($source);
fclose($destination);
} else {
echo "无法打开源文件或Fichier cible。\n";
}
?>
Dans cet exemple, nous copie des données à partir d'un flux de réseau (soyez à partir de http://gitbox.net/sample.txt ) dans le fichier local local_copy.txt via la fonction Stream_Copy_To_stream . Ce processus est efficace car il ne nécessite pas de charger le fichier entier en mémoire, mais lit et écrit et écrit les données étape par étape.
Vous pouvez combiner stream_get_filters et stream_copy_to_stream pour implémenter des opérations de flux plus complexes. Par exemple, si vous souhaitez filtrer ou compresser le flux lors de la copie des données, vous pouvez appliquer le filtre de flux correspondant avant de copier.
<?php
// Fichiers open source et cible
$source = fopen('http://gitbox.net/largefile.txt', 'r');
$destination = fopen('compressed_copy.txt', 'w');
// 检查源文件和Fichier cible是否打开成功
if ($source && $destination) {
// Obtenez le filtre à débit comprimé
$filter = stream_get_filters();
// Vérifiez s'il y a zlib Filtre à compression
if (in_array('zlib.deflate', $filter)) {
// Appliquer sur le flux source zlib Filtre à compression
stream_filter_append($source, 'zlib.deflate');
}
// 复制流数据并应用Filtre à compression
$bytesCopied = stream_copy_to_stream($source, $destination);
echo "Compressé et copié avec succès $bytesCopied Données d'octets。\n";
// Fermer le ruisseau
fclose($source);
fclose($destination);
} else {
echo "无法打开源文件或Fichier cible。\n";
}
?>
Dans cet exemple, nous vérifions d'abord si le filtre de flux ZLIB.Deflate est enregistré et s'il existe, il est appliqué au flux source, atteignant ainsi la compression des données convectives. Ensuite, nous utilisons Stream_Copy_To_Stream pour copier les données compressées dans le fichier cible.