Position actuelle: Accueil> Derniers articles> Comment résoudre le problème de l'utilisation excessive de la mémoire lors du traitement des fichiers volumineux en utilisant la fonction hash_update_stream?

Comment résoudre le problème de l'utilisation excessive de la mémoire lors du traitement des fichiers volumineux en utilisant la fonction hash_update_stream?

M66 2025-06-11

Lors du traitement des fichiers volumineux en PHP, nous sommes souvent confrontés au problème de l'utilisation excessive de la mémoire. Surtout lorsque vous devez calculer la valeur de hachage d'un fichier (tel que MD5, SHA1, etc.), si le fichier entier est chargé en mémoire en même temps, il peut provoquer une énorme consommation de mémoire, ou même dépasser la limite de mémoire, provoquant un écrasement du programme. Pour éviter cela, PHP fournit une fonction hash_update_stream , qui nous permet de lire des fichiers et de calculer le bloc de hachage par bloc, réduisant ainsi efficacement l'utilisation de la mémoire.

1. Introduction à la fonction hash_update_stream

hash_update_stream est une fonction de PHP pour mettre à jour les calculs de hachage. Il accepte un flux de fichiers ouvert (Stream) et met à jour le hachage du bloc de contenu de fichier Block by Block. Par rapport au chargement du contenu des fichiers directement dans la mémoire, HASH_UPDATE_STERME peut traiter les fichiers volumineux étape par étape, réduisant considérablement l'empreinte de la mémoire.

La signature de la fonction est la suivante:

 bool hash_update_stream ( resource $context , resource $file_handle [, int $length = 1024 ] )
  • $ Context : Il s'agit d'un contexte de hachage créé par la fonction hash_init .

  • $ file_handle : la poignée de ressource du fichier, généralement obtenu via la fonction fopen .

  • $ Longueur : Nombre d'octets lus par temps, la valeur par défaut est de 1024 octets (1KB).

2. Résolvez le problème de mémoire du traitement des fichiers grands

Supposons que nous ayons un grand fichier et que nous devons calculer son hachage MD5. L'approche traditionnelle consiste à lire l'ensemble du fichier en mémoire, puis à calculer la valeur de hachage. Cependant, pour les fichiers volumineux, cette pratique peut entraîner un débordement de mémoire.

 $file = 'path/to/largefile.txt'; // Remplacer par le chemin du fichier réel
$context = hash_init('md5');

$handle = fopen($file, 'rb');
if ($handle) {
    while (!feof($handle)) {
        $buffer = fread($handle, 1024); // Lire1KBdonnées
        hash_update($context, $buffer);
    }
    fclose($handle);
}

$hash = hash_final($context);
echo "File MD5 hash: " . $hash;

Comme indiqué ci-dessus, nous lisons le fichier en morceaux et mettons à jour la valeur de hachage à l'aide de hash_update . Le hash_update ici est calculé pour les blocs plus petits, mais l'utilisation de la mémoire est toujours déterminée en fonction de la taille du bloc.

3. Utilisez hash_update_stream pour optimiser l'utilisation de la mémoire

Contrairement à l'utilisation directement de hash_update , la fonction hash_update_stream nous permet de traiter directement les flux de fichiers sans lire manuellement le contenu du fichier, ce qui facilite la mise à jour progressivement de la valeur de hachage tout en réduisant la consommation de mémoire.

Le code optimisé est le suivant:

 $file = 'path/to/largefile.txt'; // Remplacer par le chemin du fichier réel
$context = hash_init('md5');

$handle = fopen($file, 'rb');
if ($handle) {
    while (!feof($handle)) {
        // 每次从文件流中Lire1024Octets et hachage de mise à jour
        hash_update_stream($context, $handle, 1024);
    }
    fclose($handle);
}

$hash = hash_final($context);
echo "File MD5 hash: " . $hash;

4. Pourquoi hash_update_stream est-il plus efficace?

L'avantage de hash_update_stream est qu'il peut gérer directement le flux de fichiers sans lire manuellement chaque pièce du fichier. Cette méthode permet au programme de réduire efficacement l'utilisation de la mémoire lors du calcul des valeurs de hachage.

  1. Lire le bloc par bloc : hash_update_stream lira les données du bloc de fichier par bloc, au lieu de charger le fichier entier en mémoire à la fois.

  2. Consommation de mémoire faible : grâce aux opérations de streaming, l'empreinte de la mémoire est très faible et seuls les blocs de fichiers qui sont actuellement traités doivent être stockés.

  3. Convient pour les fichiers volumineux : pour les très grands fichiers (comme quelques Go ou plus), Hash_update_stream est idéal.

5. Remplacement de l'URL dans l'application réelle

Dans les applications pratiques, vous pouvez rencontrer des scénarios où vous devez calculer la valeur de hachage d'un fichier distant. Supposons que nous devons calculer la valeur de hachage du fichier pointé par une adresse URL, nous pouvons utiliser une méthode similaire:

 $url = 'http://example.com/largefile.txt'; // Exemple URL
$file = fopen($url, 'rb');
if ($file) {
    $context = hash_init('md5');
    while (!feof($file)) {
        hash_update_stream($context, $file, 1024);
    }
    fclose($file);

    $hash = hash_final($context);
    echo "File MD5 hash: " . $hash;
}

Mais puisque vous demandez à remplacer le nom de domaine URL M66.net , nous pouvons modifier l'URL ci-dessus pour: