Dans PHP, la fonction md5_file () est utilisée pour calculer la valeur de hachage MD5 d'un fichier donné. Ceci est très utile pour la vérification de l'intégrité des fichiers, la vérification du cache et d'autres scénarios. Cependant, lorsque nous utilisons md5_file () sur les systèmes de fichiers montés réseau (tels que les NF, les SMB / CIF, etc.), nous pouvons rencontrer des problèmes de performances anormaux, ce qui a entraîné des résultats de calcul incorrects ou une fonction lente.
Cet article discutera des raisons des performances anormales de md5_file () sur le système de fichiers monté sur le réseau et fournit des solutions correspondantes.
MD5_FILE () lit essentiellement l'intégralité du contenu du fichier spécifié, puis effectue un calcul de hachage MD5 sur le contenu. Son processus central est:
<code>
$file = '/path/to/file';
$md5 = md5_file($file);
echo $md5;
</code>
Les fonctions liront l'intégralité du contenu du fichier séquentiellement, de sorte que la vitesse de lecture est étroitement liée aux performances de réponse du système de fichiers.
Un système de fichiers de montage réseau (NFS ou autre comme SMB) consiste à monter le stockage à distance sur le système local via un protocole réseau, ce qui le rend manifeste en tant que répertoire local. En raison de la communication du réseau, les caractéristiques suivantes existent:
La latence élevée : chaque lecture de fichier nécessite une demande de réseau, qui est supérieure à celle du disque local.
Le mécanisme de cache est complexe : les systèmes de fichiers réseau ont souvent des caches du client et du côté serveur, ce qui peut entraîner un contenu de fichier incohérent.
Problèmes de verrouillage et de synchronisation des fichiers : le mécanisme de verrouillage des fichiers et la stratégie de synchronisation dans les systèmes de fichiers réseau peuvent être différents des systèmes de fichiers locaux, affectant l'atomicité de la lecture de fichiers.
MD5_FILE () doit lire l'intégralité du contenu du fichier, et la latence élevée du système de fichiers réseau augmentera considérablement l'heure d'exécution de la fonction, en particulier pour les fichiers volumineux:
<code>
$file = '/mnt/nfs/path/to/largefile.txt';
$start = microtime(true);
$md5 = md5_file($file);
$end = microtime(true);
echo "Calcul qui prend du temps:" . ($end - $start) . "Deuxième,MD5:" . $md5;
</code>
Les limitations de latence du réseau et de la bande passante peuvent ralentir les vitesses de lecture, provoquant un blocage du programme.
Le mécanisme de mise en cache du système de fichiers réseau peut entraîner une mise à jour partiellement du fichier pendant le processus de lecture, ce qui entraîne le fragment de données lu par md5_file () et non un instantané du même point de temps, entraînant des valeurs de hachage incohérentes.
Dans certains environnements de montage, la lecture de fichiers peut être verrouillée par d'autres processus ou le mécanisme de verrouillage du protocole de système de fichiers réseau est incomplet, ce qui entraîne des données de fichiers incomplètes ou corrompues lues par md5_file () .
Si possible, la valeur MD5 est préférée calculée localement sur le serveur où réside le fichier, puis transférer les résultats, plutôt que directement dans le répertoire de montage distant client.
Copiez le fichier distant dans le répertoire temporaire local, puis utilisez md5_file () pour la copie locale:
<code>
$remoteFile = '/mnt/nfs/path/to/file.txt';
$localTempFile = '/tmp/file.txt';
// Copier à local
copy($remoteFile, $localTempFile);
// Calculer les fichiers locauxMD5
$md5 = md5_file($localTempFile);
echo $md5;
// Supprimer les fichiers temporaires
unlink($localTempFile);
</code>
Cela évite les problèmes de retard et de mise en cache causés par les systèmes de fichiers réseau.
Si le fichier est grand et ne peut pas être copié facilement, envisagez d'utiliser une lecture en morceaux et un calcul progressif de MD5 pour éviter les goulots d'étranglement des performances causés par une lecture ponctuelle.
<code>
$file = '/mnt/nfs/path/to/file.txt';
$context = hash_init('md5');
$fp = fopen($file, 'rb');
if ($fp) {
while (!feof($fp)) {
$buffer = fread($fp, 8192);
hash_update($context, $buffer);
}
fclose($fp);
$md5 = hash_final($context);
echo $md5;
}
</code>
Ajustez les options de montage, telles que les politiques de cache (options NFS telles que ACTTimeo et NOAC ) pour optimiser la cohérence des fichiers et lire les performances.
MD5_FILE () effectue des efforts anormalement sur les systèmes de fichiers montés réseau, principalement en raison de problèmes tels que le retard du réseau, l'incohérence du cache et le verrouillage des fichiers. En évitant le fonctionnement direct du fichier de montage à distance, en utilisant des répliques de cache locales, en blocage des calculs de streaming et en configurant raisonnablement les paramètres de montage, la stabilité et les performances de md5_file () peuvent être efficacement améliorées.
Comprendre les caractéristiques et les limites des systèmes de fichiers réseau est la clé pour assurer le fonctionnement normal des fonctions de fonctionnement des fichiers PHP.