Dans PHP, la fonction MD5_FILE est utilisée pour calculer la valeur de hachage MD5 d'un fichier spécifié, qui est souvent utilisé pour la vérification de l'intégrité du fichier. Mais parfois, même si le chemin du fichier semble correct, md5_file ne fonctionne toujours pas correctement, renvoyant une valeur fausse ou vide. Cette situation peut être déroutante. Cet article présentera des idées d'enquête détaillées pour vous aider à localiser et à résoudre des problèmes.
Bien que vous pensiez que le chemin est OK, il est recommandé d'utiliser les méthodes suivantes pour vérifier:
<?php
$file = '/path/to/your/file.txt';
if (file_exists($file)) {
echo "Le fichier existe";
} else {
echo "Le fichier n'existe pas";
}
?>
Si File_Exists renvoie false, cela signifie que le problème du chemin existe toujours. Avis:
Le chemin est-il absolu? Les chemins relatifs sont-ils basés sur le répertoire de travail correct?
Le chemin a-t-il des caractères chinois ou spéciaux, ce qui peut entraîner la résolution de l'échec?
Utilisez la fonction realPath () pour confirmer l'emplacement réel du chemin:
<?php
echo realpath('/path/to/your/file.txt');
?>
Même si le fichier existe, MD5_FILE échouera si l'utilisateur PHP Run n'a pas d'autorisations de lecture. Vérifier les autorisations:
Sous Linux, utilisez LS -L pour afficher les autorisations de fichiers pour confirmer que les utilisateurs de PHP (tels que www-data) ont des autorisations de lecture.
Testez si vous pouvez lire des fichiers en PHP:
<?php
$file = '/path/to/your/file.txt';
$content = @file_get_contents($file);
if ($content === false) {
echo "Impossible de lire le fichier,Veuillez vérifier les autorisations";
} else {
echo "Le fichier lisible";
}
?>
Certaines configurations PHP peuvent limiter l'accès au fichier:
Open_Basedir Restriction: Si elle est activée, PHP ne peut accéder au répertoire spécifié que, et il échouera s'il est hors de portée. Vous pouvez utiliser phpinfo () pour afficher les paramètres Open_Basedir .
Safe_Mode (ancienne version PHP): restreint également l'accès au fichier.
Assurez-vous que le chemin du fichier est dans la plage autorisée.
Dans de rares cas, si un fichier est verrouillé par un autre processus ou est écrit, il peut provoquer une défaillance de lecture. Vous pouvez essayer de fermer le processus d'occupation ou réessayer plus tard.
Les fichiers de format extrêmes ou spéciaux, bien que rares, peuvent également entraîner l'échec de MD5_FILE . Vous pouvez d'abord essayer d'exécuter des tests sur d'autres petits fichiers:
<?php
echo md5_file('/path/to/smallfile.txt');
?>
Si le petit fichier est normal, le problème peut être avec le fichier lui-même.
Activez le rapport d'erreur pour voir s'il y a des invites d'erreur associées:
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
$file = '/path/to/your/file.txt';
$result = md5_file($file);
if ($result === false) {
echo "Échec du calcul,Le fichier peut ne pas être accessible";
} else {
echo "MD5: $result";
}
?>
Si le MD5_FILE ne fonctionne pas à tout moment, vous pouvez lire manuellement le contenu du fichier et utiliser les calculs MD5 pour voir s'il réussit:
<?php
$file = '/path/to/your/file.txt';
$content = @file_get_contents($file);
if ($content === false) {
echo "La lecture a échoué";
} else {
echo md5($content);
}
?>
Si cela réussit, cela signifie qu'il y a un problème avec MD5_FILE en lisant le fichier, ce qui peut être dû à l'EMI sous-jacente ou aux autorisations.
<?php
$file = '/path/to/your/file.txt';
if (!file_exists($file)) {
die("Le fichier n'existe pas");
}
if (!is_readable($file)) {
die("Fichier non lisible");
}
$md5 = md5_file($file);
if ($md5 === false) {
die("md5_file Échec du calcul");
}
echo "document $file de MD5 La valeur est:$md5";
?>
MD5_FILE prend également en charge l'accès aux fichiers distants via URL, mais cela dépend de la configuration de perte_url_fopen . Si vous utilisez quelque chose comme:
<?php
echo md5_file('http://m66.net/path/to/file');
?>
Besoin de s'assurer:
allow_url_fopen est activé dans la configuration PHP.
Le serveur distant répond normalement.
La connexion réseau est normale.
Sinon, il renverra un échec.