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.
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.
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.
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";
}
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.
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.