Lors du traitement des fichiers volumineux, en particulier dans les scénarios où il y a beaucoup de fichiers et ne peut pas être chargé directement en mémoire, nous devons souvent déterminer si le fichier a changé. Les méthodes de comparaison de fichiers traditionnelles peuvent consommer plus de mémoire, surtout lorsque la taille du fichier est énorme. Par conséquent, il s'agit d'une méthode efficace et couramment utilisée pour détecter si un fichier est modifié en fonction d'une valeur de hachage.
Dans PHP, Hash_update_stream peut être utilisé pour calculer progressivement la valeur de hachage du fichier, réalisant ainsi la détection des modifications de fichiers importantes. Cet article présentera en détail comment utiliser cette fonction pour vérifier les modifications du contenu du fichier.
hash_update_stream est une fonction de PHP qui calcule la valeur de hachage d'un flux de données (comme un fichier). Il nous permet de traiter le contenu du fichier étape par étape et de calculer la valeur de hachage du fichier. Contrairement au calcul directement du hachage de l'ensemble du fichier, Hash_update_stream convient plus aux fichiers volumineux car il évite de charger le fichier entier en mémoire à la fois.
Pour détecter si un fichier a été modifié, nous les implémentons généralement via les étapes suivantes:
Générer une valeur de hachage du fichier : Tout d'abord, vous devez générer une valeur de hachage initiale pour le fichier. Cette valeur de hachage peut être calculée par hash_update_stream et enregistrée comme "empreinte digitale" de l'état d'origine du fichier.
Vérifiez périodiquement la valeur de hachage du fichier : lorsque vous devez vérifier si le fichier a changé, calculez à nouveau la valeur de hachage du fichier et comparez-le avec la valeur de hachage enregistrée auparavant.
Déterminez si le fichier est modifié : si la nouvelle valeur de hachage est différente de l'ancienne valeur de hachage, cela signifie que le fichier a été modifié. Sinon, le fichier n'a pas changé.
Afin d'implémenter la fonction de vérification ci-dessus, nous devons d'abord comprendre comment utiliser hash_update_stream pour calculer la valeur de hachage d'un fichier. Voici un exemple de code:
<?php
// Définir le chemin du fichier
$file = 'path/to/your/largefile.txt';
// Ouvrir le fichier
$stream = fopen($file, 'rb');
if (!$stream) {
die('无法Ouvrir le fichier');
}
// utiliser hash_update_stream Calculer progressivement la valeur de hachage du fichier
$context = hash_init('sha256'); // Différents algorithmes de hachage peuvent être sélectionnés,Par exemple sha256
while (!feof($stream)) {
$data = fread($stream, 8192); // Lire les fichiers Block par bloc
hash_update_stream($context, $data); // Mettre à jour la valeur de hachage
}
// Calculez la valeur de hachage finale
$hash = hash_final($context);
fclose($stream);
// La valeur de hachage du fichier de sortie
echo "La valeur de hachage du fichier est: $hash\n";
?>
Dans le code ci-dessus, nous créons un contexte de hachage via hash_init et mettons progressivement à jour la valeur de hachage via hash_update_stream . Lisez un petit morceau de données du flux de fichiers à chaque fois et passez-le à hash_update_stream jusqu'à la lecture du fichier. Enfin, obtenez la valeur de hachage finale du fichier via Hash_Final .
Ensuite, nous devons stocker la valeur de hachage du fichier afin que nous puissions le comparer si nécessaire. Voici un exemple de code pour vérifier si le fichier a été modifié:
<?php
// Chemin de fichier pour stocker la valeur de hachage d'origine
$hashFile = 'path/to/your/previous_hash.txt';
// Obtenez la valeur de hachage d'origine(S'il y a)
$previousHash = file_exists($hashFile) ? file_get_contents($hashFile) : null;
// Obtenez la valeur de hachage du fichier actuel
$file = 'path/to/your/largefile.txt';
$stream = fopen($file, 'rb');
if (!$stream) {
die('无法Ouvrir le fichier');
}
$context = hash_init('sha256');
while (!feof($stream)) {
$data = fread($stream, 8192);
hash_update_stream($context, $data);
}
$currentHash = hash_final($context);
fclose($stream);
// S'il y a之前的哈希值,Faire une comparaison
if ($previousHash !== null) {
if ($previousHash === $currentHash) {
echo "Le fichier n'a pas été modifié。\n";
} else {
echo "Le fichier a été modifié。\n";
}
} else {
echo "Aucune valeur de hachage précédente n'a été trouvée,无法Faire une comparaison。\n";
}
// Enregistrer la valeur de hachage actuelle,Pour la comparaison suivante
file_put_contents($hashFile, $currentHash);
?>
Dans ce code, nous essayons d'abord de lire la valeur de hachage précédemment enregistrée du fichier. Ensuite, recalculez la valeur de hachage du fichier actuel et comparez-le. Si les valeurs de hachage sont cohérentes, cela signifie que le fichier n'a pas changé; Si c'est différent, le fichier a été modifié. Enfin, nous enregistrons la valeur de hachage actuelle dans le fichier pour la comparaison suivante.
Grâce aux étapes ci-dessus, nous pouvons utiliser efficacement hash_update_stream pour détecter si un grand fichier a été modifié. Par rapport à la charge directe de l'ensemble du fichier en mémoire, cette méthode présente des avantages évidents dans l'utilisation et les performances de la mémoire, et est particulièrement adapté pour gérer des fichiers très volumineux.
Grâce à la comparaison de la valeur de hachage, nous pouvons implémenter la vérification d'intégrité du contenu du fichier pour garantir que le fichier n'est pas falsifié ou perdu.
J'espère que cet article pourra vous aider à comprendre comment utiliser la fonction hash_update_stream dans PHP pour détecter la modification des fichiers volumineux et améliorer votre efficacité de gestion de fichiers dans le développement réel.