Position actuelle: Accueil> Derniers articles> Les avantages de performance de hash_update_stream () dans le traitement des fichiers larges

Les avantages de performance de hash_update_stream () dans le traitement des fichiers larges

M66 2025-05-27

En PHP, le calcul de la valeur de hachage d'un fichier est une opération courante. Pour les petits fichiers, l'utilisation de hash_file () est très intuitive et efficace. Cependant, les performances de ces méthodes peuvent devenir un goulot d'étranglement face à des fichiers super-grands. Pour optimiser les performances, la fonction hash_update_stream () fournit une solution plus efficace. Aujourd'hui, nous explorerons l'utilisation de la fonction hash_update_stream () en profondeur et analyser ses améliorations de performances lorsqu'ils traitent avec des fichiers super volumineux.

arrière-plan

Lorsque nous travaillons avec des fichiers volumineux (comme quelques Go de fichiers), le fonctionnement du calcul des valeurs de hachage peut consommer beaucoup de mémoire et de ressources CPU. Bien que la fonction HASH_FILE () intégrée dans PHP soit facile à utiliser, pour les fichiers super-grands, il lira complètement le fichier en mémoire, ce qui peut entraîner une dégradation des performances et même provoquer un débordement de mémoire. Pour éviter ces problèmes, hash_update_stream () offre la possibilité de lire des fichiers en morceaux, réduisant ainsi la consommation de mémoire.

hash_update_stream () Introduction

hash_update_stream () est une fonction introduite dans PHP 5.1.2 qui permet à la valeur de hachage d'être mise à jour lorsque les données de flux sont lues. Contrairement à hash_file () qui charge le fichier entier immédiatement, hash_update_stream () peut lire le bloc de données du fichier par bloc et mettre à jour la valeur de hachage à chaque fois que les données sont lues, évitant ainsi une utilisation excessive de la mémoire.

Exemple de code:

 <?php
$hashContext = hash_init('sha256');  // Initialiser le contexte du hachage
$stream = fopen('largefile.txt', 'rb');  // Ouvrir un grand fichier

// Lire les fichiers et mettre à jour le bloc de hachage par bloc
while (!feof($stream)) {
    $buffer = fread($stream, 8192);  // Chaque lecture 8KB
    hash_update_stream($hashContext, $buffer);  // Mettre à jour le hachage
}

fclose($stream);  // Fermez le flux de fichiers
$hashValue = hash_final($hashContext);  // Obtenez la valeur de hachage finale

echo "La valeur de hachage du fichier est: $hashValue";
?>

Dans cet exemple, nous utilisons hash_update_stream () pour lire le bloc de contenu du fichier Block par bloc et mettre à jour la valeur de hachage en temps réel. En traitant de grands fichiers en morceaux, nous pouvons réduire considérablement l'utilisation de la mémoire et améliorer l'efficacité du traitement des fichiers.

Comparaison des performances

Pour évaluer les performances de hash_update_stream () Lors de la gestion des fichiers très grands, nous pouvons le comparer avec hash_file () . Supposons que nous ayons un fichier avec une taille de 10 Go de grande file.txt , nous utilisons deux méthodes pour calculer le hachage du fichier et comparer leurs performances.

Utilisez hash_file () :

 $hashValue = hash_file('sha256', 'largefile.txt');
echo "La valeur de hachage du fichier est: $hashValue";

L'inconvénient de cette approche est qu'il charge l'ensemble du fichier en mémoire, ce qui est très inefficace pour les fichiers super-grands. Si le fichier est trop grand, il peut même provoquer un débordement de mémoire.

Utilisez hash_update_stream () :

 $hashContext = hash_init('sha256');
$stream = fopen('largefile.txt', 'rb');
while (!feof($stream)) {
    $buffer = fread($stream, 8192);
    hash_update_stream($hashContext, $buffer);
}
fclose($stream);
$hashValue = hash_final($hashContext);
echo "La valeur de hachage du fichier est: $hashValue";

En lisant les fichiers Block by Block, la méthode hash_update_stream () réduit considérablement l'utilisation de la mémoire et peut gérer efficacement les fichiers super-grands. L'utilisation de la mémoire est considérablement réduite, en particulier lorsque les fichiers sont grands (comme 10 Go ou plus).

Facteurs clés pour l'amélioration des performances

  1. Optimisation de la mémoire : hash_update_stream () Lire les fichiers Block par bloc, plutôt que de charger des fichiers en mémoire à la fois. De cette façon, lors du traitement des fichiers volumineux, l'utilisation de la mémoire est très optimisée.

  2. Performance d'E / S : Lors de l'utilisation de hash_update_stream () , seule un petit morceau de données est lu à la fois, ce qui rend le flux de fichier la lecture plus efficace et ne lit pas toutes les données à la fois, évitant la charge excessive sur le disque.

  3. Adaptabilité forte : contrairement à hash_file () , hash_update_stream () peut gérer les données de n'importe quel type de flux, sans s'y limiter aux fichiers. Cela le rend très utile dans d'autres scénarios où les données de streaming sont traitées en morceaux.

Scénarios d'application pratiques

hash_update_stream () convient particulièrement aux scénarios suivants:

  1. Vérification de téléchargement de fichiers grand : lors de la gestion des téléchargements de fichiers importants, nous devons généralement hacher les fichiers téléchargés pour vérifier l'intégrité du fichier. Utilisez hash_update_stream () pour calculer les valeurs de hachage lors du téléchargement de fichiers, de la réduction de la consommation de mémoire et de l'amélioration de la vitesse de traitement.

  2. Stockage distribué : Dans un système de stockage distribué, il peut être nécessaire de repasser des fichiers extrêmement volumineux et de calculer la valeur de hachage de chaque bloc. À l'heure actuelle, hash_update_stream () fournit un moyen efficace de prendre en charge les calculs de streaming.

  3. Traitement des données en temps réel : Dans certains traitements de données en streaming, tels que l'analyse des fichiers journaux ou le traitement de flux de données en temps réel, HASH_UPDATE_STREAM () peut être utilisé comme un outil de calcul de hachage efficace.

en conclusion

hash_update_stream () améliore considérablement les performances lors de la gestion des fichiers super volumineux, en particulier dans la gestion de la mémoire et le traitement d'E / S. En lisant le fichier dans des morceaux et en mettant progressivement à la mise à jour de la valeur de hachage, hash_update_stream () peut réduire la consommation de mémoire et éviter le problème de charger le fichier entier à la fois. Par conséquent, il s'agit d'un outil très utile pour les scénarios où les fichiers volumineux doivent être gérés.