Position actuelle: Accueil> Derniers articles> Que dois-je faire si j'utilise md5_file () sur un grand fichier?

Que dois-je faire si j'utilise md5_file () sur un grand fichier?

M66 2025-05-28

Dans PHP, MD5_FILE est une fonction très pratique pour calculer la valeur de hachage MD5 d'un fichier. Son utilisation est simple, il suffit de le passer dans le chemin du fichier:

 $hash = md5_file('http://m66.net/path/to/largefile.zip');
echo $hash;

Cependant, lorsque le fichier est très grand, l'utilisation de MD5_FILE peut provoquer des surtensions de mémoire et même déclencher des erreurs de débordement de mémoire. En effet, PHP essaie en interne de lire le fichier entier en mémoire, surtout lorsqu'il s'agit d'une URL distante, qui est plus facile à consommer beaucoup de mémoire.


Pourquoi MD5_FILE a-t-il une surtension en mémoire?

Bien que MD5_FILE soit une fonction facile, il tamponne souvent l'intégralité du fichier lorsqu'il fonctionne réellement dans la couche sous-jacente. Pour les fichiers volumineux avec des centaines de mégaoctets ou même quelques Go, l'empreinte mémoire sera très élevée et il est facile de dépasser la limite de mémoire de PHP.


Plus d'alternatives d'économie de mémoire

Afin d'éviter les surtensions de mémoire, nous pouvons implémenter une solution pour lire des flux de fichiers en morceaux et calculer MD5 dans les segments. De cette façon, seules les petites données sont lues à la fois, et l'utilisation de la mémoire est extrêmement faible.

Exemple du schéma:

 function md5_file_stream(string $filename): string|false {
    // Si c'est éloignéURL,Vérifiez d'abord si l'en-tête du protocole le prend en charge
    $context = stream_context_create([
        'http' => ['method' => 'GET', 'timeout' => 10]
    ]);

    // Essayez d'ouvrir le flux de fichiers
    $fp = fopen($filename, 'rb', false, $context);
    if (!$fp) {
        return false;
    }

    $hashContext = hash_init('md5');

    while (!feof($fp)) {
        // Chaque lecture8KB,Pression de mémoire basse
        $data = fread($fp, 8192);
        if ($data === false) {
            fclose($fp);
            return false;
        }
        hash_update($hashContext, $data);
    }

    fclose($fp);

    return hash_final($hashContext);
}

// Exemple d'utilisation
$url = 'http://m66.net/path/to/largefile.zip';
$md5 = md5_file_stream($url);
if ($md5 !== false) {
    echo "Déposé MD5 La valeur est:$md5\n";
} else {
    echo "Échec de la lecture du fichier ou de l'erreur calculée。\n";
}

Avantages du programme

  • Enregistrement de la mémoire : ne lisez qu'une petite quantité de données à la fois et l'utilisation de la mémoire est stable.

  • Applicable aux fichiers volumineux : Prise en charge du calcul de hachage des fichiers volumineux locaux et distants.

  • Flexibilité élevée : la taille du bloc de lecture peut être ajustée (comme 16 Ko, 32 Ko, etc.) pour s'adapter à différents scénarios.


Résumer

Lorsque vous rencontrez des fichiers volumineux qui doivent être calculés par MD5 et l'utilisation de la mémoire MD5_FILE est trop élevée, l'utilisation de lecture en morceaux pour calculer le hachage est un meilleur choix. Il évite non seulement les explosions de mémoire, mais maintient également le code simple et efficace.