La création d'un tableau de signature de fichiers efficace est critique lors du développement de systèmes impliquant la gestion des fichiers, le contrôle de version ou la vérification de l'intégrité des fichiers. PHP fournit une fonction intégrée MD5_FILE () pour calculer la valeur de hachage MD5 d'un fichier. Nous pouvons combiner la base de données pour implémenter un système de signature de fichiers flexible et efficace. Cet article vous amènera à atteindre cet objectif étape par étape.
MD5_FILE () est une fonction pratique fournie par PHP pour calculer la valeur MD5 du contenu du fichier. Contrairement à MD5 () , il ne vous oblige pas à lire le fichier entier avec file_get_contents () en premier, mais calculer la signature directement via le chemin du fichier, qui est plus efficace lorsque vous traitez avec de grands fichiers.
Exemple d'utilisation:
$hash = md5_file('/path/to/file.zip');
echo $hash;
Afin de gérer les signatures de fichiers, nous devons enregistrer les informations suivantes dans la base de données:
Chemin de fichier ou identifiant unique
Valeur MD5 du fichier
Mettre à jour
Une simple structure de table MySQL peut être la suivante:
CREATE TABLE file_hashes (
id INT AUTO_INCREMENT PRIMARY KEY,
file_path VARCHAR(255) NOT NULL UNIQUE,
md5_hash CHAR(32) NOT NULL,
updated_at DATETIME NOT NULL
);
Nous pouvons analyser régulièrement le répertoire de fichiers, comparer la valeur MD5 du fichier actuel avec la valeur stockée dans la base de données et déterminer si le fichier a changé.
function updateFileHash($filePath, $pdo) {
if (!file_exists($filePath)) {
return false;
}
$md5 = md5_file($filePath);
$now = date('Y-m-d H:i:s');
$stmt = $pdo->prepare("SELECT md5_hash FROM file_hashes WHERE file_path = :file_path");
$stmt->execute(['file_path' => $filePath]);
$existing = $stmt->fetch(PDO::FETCH_ASSOC);
if ($existing) {
if ($existing['md5_hash'] !== $md5) {
// Le contenu du fichier a été modifié,Mettre à jour les enregistrements
$updateStmt = $pdo->prepare("
UPDATE file_hashes
SET md5_hash = :md5_hash, updated_at = :updated_at
WHERE file_path = :file_path
");
$updateStmt->execute([
'md5_hash' => $md5,
'updated_at' => $now,
'file_path' => $filePath
]);
}
} else {
// Nouveau fichier,Insérer un enregistrement
$insertStmt = $pdo->prepare("
INSERT INTO file_hashes (file_path, md5_hash, updated_at)
VALUES (:file_path, :md5_hash, :updated_at)
");
$insertStmt->execute([
'file_path' => $filePath,
'md5_hash' => $md5,
'updated_at' => $now
]);
}
return true;
}
Vous pouvez traverser le système de fichiers et effectuer une gestion des fichiers de signature par lots dans le répertoire:
function scanDirectoryAndUpdate($directory, $pdo) {
$files = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator($directory)
);
foreach ($files as $file) {
if ($file->isFile()) {
updateFileHash($file->getPathname(), $pdo);
}
}
}
Ce mécanisme peut être largement utilisé dans:
Système de suivi de la version de fichier
Jugement de défaillance du CDN ou du cache
Système de surveillance à l'épreuve
Détection de synchronisation des fichiers pour un système de déploiement simple
Par exemple, le système de déploiement peut calculer sa valeur MD5 avant de télécharger un fichier et de le comparer avec les enregistrements dans la base de données côté serveur. S'il est cohérent, il n'est pas nécessaire de le télécharger, ce qui améliore l'efficacité du déploiement.
Vous pouvez même créer un panneau Web pour afficher l'historique des modifications de la signature du fichier, similaire à: