Dans le développement de PHP, la fonction md5_file () est souvent utilisée pour obtenir la valeur de hachage MD5 d'un fichier, ce qui est pratique pour vérifier l'intégrité du fichier ou détecter les modifications de fichier. Cependant, lorsque md5_file () est tenu d'appeler plusieurs fois sur le même lot de fichiers, les opérations fréquentes de disque IO peuvent réduire considérablement l'efficacité de l'exécution du programme. À cette fin, nous pouvons améliorer l'efficacité d'exécution de la fonction md5_file () lorsque plusieurs appels sont appelés via le mécanisme de mise en cache.
Chaque fois que la fonction MD5_FILE () est appelée, il lit le contenu de fichier entier à partir du disque et calcule la valeur MD5. Si le même fichier est appelé plusieurs fois, le contenu du fichier est lu à plusieurs reprises, provoquant une consommation de ressources inutile, en particulier lorsque les fichiers sont grands ou que le nombre de fichiers est important, la perte de performances est plus évidente.
L'idée principale du mécanisme de cache est: calculer et enregistrer le résultat lorsque md5_file () est appelé pour la première fois, et obtenir directement la valeur de hachage à partir du cache lors de la demande à nouveau du même fichier pour éviter les calculs répétés.
Le cache peut être stocké en mémoire (tels que des tableaux, des variables statiques), des fichiers ou d'autres supports de stockage, et est sélectionné en fonction de la scène réelle.
Voici un exemple simple basé sur le cache de mémoire, implémentant le cache de MD5_File () Résultats:
<?php
class Md5FileCache {
private static $cache = [];
/**
* Obtenez le fichierMD5valeur,Soutenir la mise en cache
*
* @param string $filePath Chemin de fichier
* @return string|false retourMD5Chaîne,失败retourfalse
*/
public static function getMd5(string $filePath) {
// Vérifiez si le cache existe en premier
if (isset(self::$cache[$filePath])) {
return self::$cache[$filePath];
}
// Le cache n'existe pas,calculerMD5
if (!file_exists($filePath)) {
return false;
}
$md5 = md5_file($filePath);
if ($md5 !== false) {
self::$cache[$filePath] = $md5;
}
return $md5;
}
}
// Exemple d'utilisation
$file = '/path/to/your/file.txt';
$md5_1 = Md5FileCache::getMd5($file);
$md5_2 = Md5FileCache::getMd5($file); // Obtenez-le directement à partir du cache ici,避免重复calculer
echo "MD5: " . $md5_1 . PHP_EOL;
?>
Le résultat du cache peut être invalidé en raison de la modification du fichier, de sorte que la vérification du cache doit être effectuée en combinaison avec le temps de modification du fichier ( fileMtime () ).
<?php
class Md5FileCache {
private static $cache = [];
public static function getMd5(string $filePath) {
if (!file_exists($filePath)) {
return false;
}
$mtime = filemtime($filePath);
if (isset(self::$cache[$filePath]) && self::$cache[$filePath]['mtime'] === $mtime) {
return self::$cache[$filePath]['md5'];
}
$md5 = md5_file($filePath);
if ($md5 !== false) {
self::$cache[$filePath] = [
'md5' => $md5,
'mtime' => $mtime,
];
}
return $md5;
}
}
?>
Si le programme fonctionne pendant longtemps ou doit être mis en cache sur les demandes, vous pouvez