Lorsque vous travaillez avec des fichiers volumineux, la lecture directe de l'ensemble du fichier et le calcul de la valeur de hachage peuvent provoquer une utilisation excessive de la mémoire et même provoquer des accidents du programme lorsque la mémoire est insuffisante. Pour résoudre ce problème, vous pouvez utiliser la fonction HASH_UPDate_stream de PHP pour lire le fichier en morceaux et calculer la valeur de hachage en temps réel. Voici un exemple qui montre comment lire un fichier en morceaux et calculer la valeur de hachage du fichier pour éviter de charger le fichier entier à la fois.
La fonction hash_update_stream est une fonction fournie par PHP pour le streaming met à jour les valeurs de hachage. Contrairement à la fonction hash_update () , Hash_update_stream met à jour les valeurs de hash Block par bloc via un flux de fichiers ( ressource ), qui convient au traitement des fichiers volumineux.
Ouvrez un flux de fichiers.
Initialisez l'algorithme de hachage à l'aide de la fonction hash_init .
Utilisez hash_update_stream pour lire le fichier en morceaux et calculer la valeur de hachage en temps réel.
Fermez le flux de fichiers une fois terminé et obtenez la valeur de hachage finale.
<?php
// Algorithme de hachage d'initialisation,Utilisé iciSHA-256
$hashAlgorithm = 'sha256';
// Ouvrez le flux de fichiers
$filePath = 'path_to_your_large_file'; // Remplacez par votre chemin de fichier
$fileStream = fopen($filePath, 'rb');
if (!$fileStream) {
die("Impossible d'ouvrir le fichier");
}
// Initialiser le calcul du hachage
$hashContext = hash_init($hashAlgorithm);
// Régler la taille du bloc,Généralement 8KB ou 16KB
$chunkSize = 8192; // 8KB
// Lisez le fichier et mettez à jour la valeur de hachage en temps réel
while (!feof($fileStream)) {
$data = fread($fileStream, $chunkSize);
hash_update_stream($hashContext, $data);
}
// Obtenez la valeur de hachage finale
$fileHash = hash_final($hashContext);
// La valeur de hachage du fichier de sortie
echo "La valeur de hachage du fichier est: " . $fileHash . "\n";
// Fermez le flux de fichiers
fclose($fileStream);
?>
Open Stream de fichiers <br> Ouvrez le fichier à l'aide de la fonction fopen et spécifiez pour lire en mode binaire ( RB ). Il s'agit de garantir que le contenu de lecture ne pose pas de problèmes en raison de différents encodages de fichiers ou des ruptures de ligne.
Algorithme de hachage d'initialisation
hash_init () est utilisé pour initialiser l'algorithme de hachage et passer dans l'algorithme de hachage de votre choix (comme Sha256 , MD5 , etc.). Cela crée un contexte de hachage pour calculer la valeur de hachage étape par étape.
Lisez le fichier et mettez à jour le hachage <br> Utilisez Fread pour lire un morceau de fichier de taille fixe (par exemple 8KB) à chaque fois. Utilisez ensuite hash_update_stream pour mettre à jour les blocs de données de lecture dans le contexte de hachage en temps réel.
Obtenez la valeur de hachage finale <br> Utilisez la fonction hash_final () pour obtenir la valeur de hachage finale calculée et fermer le flux de fichiers.
Calcul de hachage de fichiers à grand fichier <br> Lors du traitement des fichiers volumineux (tels que des fichiers supérieurs à 1 Go), les fichiers ne peuvent pas être chargés en mémoire à la fois. À l'heure actuelle, la lecture du fichier en morceaux et le calcul de la valeur de hachage peuvent réduire efficacement l'utilisation de la mémoire.
Vérification de l'intégrité du fichier <br> Pour les scénarios où le contenu des fichiers doit être assuré que le contenu des fichiers n'est pas falsifié pendant la transmission, il est très important de vérifier l'intégrité des fichiers via des valeurs de hachage.
Ajustez dynamiquement la taille du bloc <br> La taille du bloc de lecture peut être ajustée en fonction de la mémoire et des performances du disque du système. Le choix de la taille de bloc appropriée peut encore améliorer les performances.
Traitement multithread <br> Pour les fichiers très grands, vous pouvez envisager d'utiliser la technologie de lecture multith pour traiter les différentes parties du fichier simultanément pour améliorer encore l'efficacité.
Des fichiers trop volumineux conduisent à une mémoire insuffisante <br> Lorsque vous utilisez le streaming pour lire les fichiers et la mise à jour des valeurs de hachage Chunk par morceau, le fichier lui-même n'est pas complètement chargé en mémoire, évitant ainsi les problèmes de débordement de mémoire.
Formats de fichiers non pris en charge par la fonction hash_update_stream <br> Cette fonction gère les flux de données binaires, il peut donc être utilisé pour traiter tout type de fichier, y compris les fichiers texte, les images, les vidéos, etc.
Document officiel de PHP: https://www.php.net/manual/zh/fonction.hash-update-stream.php