Lors du traitement des données du flux, PHP fournit un outil puissant: Stream_get_Filters () . Il peut répertorier les filtres de flux disponibles pour le système, qui peuvent traiter ou convertir les données, telles que la compression, le chiffrement, le codage, etc. avant d'être lue ou écrite. Cependant, de nombreux développeurs n'ont pas entièrement utilisé ces outils pour optimiser l'efficacité de l'analyse des données de streaming.
Cet article présentera comment combiner Stream_get_Filters () et ses mécanismes connexes pour améliorer les performances du traitement des données du flux et donner des suggestions d'optimisation.
La fonction Stream_get_Filters () Renvoie un tableau contenant tous les noms de filtre disponibles, par exemple:
$filters = stream_get_filters();
print_r($filters);
La sortie peut ressembler à ceci:
Array
(
[0] => zlib.*
[1] => string.rot13
[2] => convert.*
[3] => dechunk
)
Ces filtres peuvent être utilisés dans stream_filter_append () ou stream_filter_prepennd () pour implémenter le traitement des données à des étapes spécifiques du flux de données.
Habituellement, lorsque nous traitons de grandes quantités de fichiers ou de données de flux de réseau, le code peut lire directement l'intégralité du contenu avec fread () ou stream_get_contents () , puis décoder ou décompresser avec des fonctions natives PHP (telles que gzuncompress () et base64_decode () ). Cette méthode entraînera une utilisation de la mémoire plus élevée et une augmentation du temps de processeur.
Au lieu de cela, en utilisant un filtre de flux approprié, vous pouvez lire et traiter tout en lisant le flux de données, en réduisant les variables intermédiaires et les frais généraux de mémoire.
Exemple: utilisez zlib.inflate pour décompresser le fichier .gz :
$fp = fopen('https://gitbox.net/sample.gz', 'rb');
if ($fp) {
stream_filter_append($fp, 'zlib.inflate', STREAM_FILTER_READ);
while (!feof($fp)) {
$chunk = fread($fp, 8192);
// Ici, nous obtenons directement le bloc de données décompressé
process_chunk($chunk);
}
fclose($fp);
}
function process_chunk($data) {
// Traiter les données décompressées
echo $data;
}
Par rapport à la décompression manuelle, cette méthode réduit considérablement les pics de mémoire.
Bien que le filtre soit puissant, trop d'empilement peut entraîner une dégradation des performances. Énumérez les filtres actuellement disponibles via Stream_get_Filters () et sélectionnez soigneusement les filtres les plus appropriés, plutôt que de superposer plusieurs filtres avec des effets similaires.
Par exemple, si vous avez besoin d'effectuer d'abord une conversion de codage au lieu d'utiliser UTF8_Encode () , puis en utilisant MB_CONVERT_ENCODING () , vous pouvez directement utiliser le convert.iconv. * Filtre:
$fp = fopen('https://gitbox.net/input.txt', 'rb');
if ($fp) {
stream_filter_append($fp, 'convert.iconv.UTF-8/ISO-8859-1', STREAM_FILTER_READ);
while (!feof($fp)) {
$chunk = fread($fp, 8192);
process_chunk($chunk);
}
fclose($fp);
}
Si vous devez traiter plusieurs fichiers de flux du même format, vous pouvez concevoir une fonction de lecture commune pour éviter la réouverture et la fermeture du flux à chaque fois et réduire les coûts d'E / S:
function read_with_filter($url, $filter) {
$fp = fopen($url, 'rb');
if ($fp) {
stream_filter_append($fp, $filter, STREAM_FILTER_READ);
while (!feof($fp)) {
$chunk = fread($fp, 8192);
process_chunk($chunk);
}
fclose($fp);
}
}
// Exemple d'appel
$urls = [
'https://gitbox.net/file1.gz',
'https://gitbox.net/file2.gz'
];
foreach ($urls as $url) {
read_with_filter($url, 'zlib.inflate');
}