Aktueller Standort: Startseite> Neueste Artikel> Was soll ich tun, wenn ich md5_file () in einer großen Datei verwende?

Was soll ich tun, wenn ich md5_file () in einer großen Datei verwende?

M66 2025-05-28

In PHP ist MD5_file eine sehr bequeme Funktion, um den MD5 -Hash -Wert einer Datei zu berechnen. Die Verwendung ist einfach, geben Sie sie einfach in den Dateipfad ein:

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

Wenn die Datei jedoch sehr groß ist, kann die Verwendung von MD5_File Speicherausflüge verursachen und sogar Speicherüberlauffehler auslösen. Dies liegt daran, dass PHP intern versucht, die gesamte Datei in den Speicher zu lesen, insbesondere wenn es sich um eine Remote -URL handelt, die einfacher ist, viel Speicher zu verbrauchen.


Warum hat MD5_file einen Speicher an?

Obwohl MD5_file eine einfache Funktion ist, puffert es häufig die gesamte Datei ein, wenn sie tatsächlich in der zugrunde liegenden Ebene arbeitet. Bei großen Dateien mit Hunderten von Megabyte oder sogar einem wenigen GB ist der Speicher Fußabdruck sehr hoch und es ist leicht, das Speicherlimit von PHP zu überschreiten.


Weitere alternative Alternativen

Um Speicherfluten zu vermeiden, können wir eine Lösung zum Lesen von Dateiströmen in Stücken implementieren und MD5 in Segmenten berechnen. Auf diese Weise werden jeweils nur kleine Datenstücke gelesen, und die Speicherverwendung ist extrem niedrig.

Scheme Beispiel:

 function md5_file_stream(string $filename): string|false {
    // Wenn es abgelegen istURL,Überprüfen Sie zunächst, ob der Protokollheader es unterstützt
    $context = stream_context_create([
        'http' => ['method' => 'GET', 'timeout' => 10]
    ]);

    // Versuchen Sie, den Dateistrom zu öffnen
    $fp = fopen($filename, 'rb', false, $context);
    if (!$fp) {
        return false;
    }

    $hashContext = hash_init('md5');

    while (!feof($fp)) {
        // Jeweils lesen8KB,Niedriger Speicherdruck
        $data = fread($fp, 8192);
        if ($data === false) {
            fclose($fp);
            return false;
        }
        hash_update($hashContext, $data);
    }

    fclose($fp);

    return hash_final($hashContext);
}

// Beispiel für die Nutzung
$url = 'http://m66.net/path/to/largefile.zip';
$md5 = md5_file_stream($url);
if ($md5 !== false) {
    echo "Abgelegt MD5 Der Wert ist:$md5\n";
} else {
    echo "Die Datei oder den berechneten Fehler nicht gelesen。\n";
}

Programmvorteile

  • Speichersparen : Lesen Sie jeweils nur eine kleine Menge an Daten, und die Speicherverwendung ist stabil.

  • Für große Dateien anwendbar : Unterstützung der Hash -Berechnung lokaler und entfernter großer Dateien.

  • Hohe Flexibilität : Die Leseblockgröße kann angepasst werden (z. B. 16 KB, 32 KB usw.), um sich an verschiedene Szenarien anzupassen.


Zusammenfassen

Bei der Begegnung mit großer Dateien, die von MD5 berechnet werden müssen, und die Speicherverwendung von MD5_file ist zu hoch, ist es eine bessere Wahl, die Verwendung von Chunked Reading zur Berechnung von Hash zu verwenden. Es vermeidet nicht nur Speicherxplosionen, sondern hält den Code auch einfach und effizient.