Bei der Arbeit mit großen Dateien kann das direkte Lesen der gesamten Datei und die Berechnung des Hash -Wertes zu übermäßigen Speicherverbrauch führen und sogar Programmabstürze verursachen, wenn der Speicher nicht ausreicht. Um dieses Problem zu lösen, können Sie die Funktion von PHP von PHP verwenden, um die Datei in Stücken zu lesen und den Hash -Wert in Echtzeit zu berechnen. Hier ist ein Beispiel, das demonstriert, wie eine Datei in Stücken liest und den Hash -Wert der Datei berechnet wird, um zu vermeiden, dass die gesamte Datei gleichzeitig geladen wird.
Die Funktion Hash_Update_Stream ist eine Funktion, die von PHP für Streaming -Updates Hash -Werte bereitgestellt wird. Im Gegensatz zur Funktion von Hash_Update () ist Hash_Update_Stream -Aktualisierung von Hash -Werten durch Block durch einen Dateistrom ( Ressource ), der für die Verarbeitung großer Dateien geeignet ist.
Öffnen Sie einen Dateistrom.
Initialisieren Sie den Hash -Algorithmus mithilfe der Hash_init -Funktion.
Verwenden Sie Hash_Update_Stream, um die Datei in Stücken zu lesen und den Hash -Wert in Echtzeit zu berechnen.
Schließen Sie den Dateistrom, wenn Sie fertig sind, und erhalten Sie den endgültigen Hash -Wert.
<?php
// Initialisierungshashing -Algorithmus,Hier verwendetSHA-256
$hashAlgorithm = 'sha256';
// Öffnen Sie den Dateistrom
$filePath = 'path_to_your_large_file'; // Ersetzen Sie durch Ihren Dateipfad
$fileStream = fopen($filePath, 'rb');
if (!$fileStream) {
die("Die Datei kann nicht geöffnet werden");
}
// Initialisieren Sie die Hash -Berechnung
$hashContext = hash_init($hashAlgorithm);
// Stellen Sie die Blockgröße ein,Normalerweise 8KB oder 16KB
$chunkSize = 8192; // 8KB
// Lesen Sie die Datei und aktualisieren Sie den Hash -Wert in Echtzeit
while (!feof($fileStream)) {
$data = fread($fileStream, $chunkSize);
hash_update_stream($hashContext, $data);
}
// Holen Sie sich den endgültigen Hash -Wert
$fileHash = hash_final($hashContext);
// Der Hash -Wert der Ausgabedatei
echo "Der Hash -Wert der Datei ist: " . $fileHash . "\n";
// Schließen Sie den Dateistrom
fclose($fileStream);
?>
Öffnen Sie den Dateistrom <br> <br> Öffnen Sie die Datei mit der FOPEN -Funktion und geben Sie an, um im Binary -Modus ( RB ) zu lesen. Dies soll sicherstellen, dass der Leseinhalt aufgrund unterschiedlicher Dateicodierung oder Zeilenumbrüche keine Probleme verursacht.
Initialisierungshashing -Algorithmus
Hash_init () wird verwendet, um den Hash -Algorithmus zu initialisieren und den Hash -Algorithmus Ihrer Wahl zu übergeben (wie SHA256 , MD5 usw.). Dadurch wird ein Hash -Kontext für die Berechnung des Hash -Werts Schritt für Schritt erstellt.
Lesen Sie die Datei und aktualisieren Sie den Hash <br> Verwenden Sie Freead , um jedes Mal einen Dateikunk (z. B. 8 KB) mit fester Größe zu lesen. Verwenden Sie dann Hash_Update_Stream, um die Lesedatenblöcke in Echtzeit in den Hash -Kontext zu aktualisieren.
Holen Sie sich den endgültigen Hash -Wert <br> Verwenden Sie die Funktion von Hash_Final (), um den endgültigen berechneten Hash -Wert zu erhalten und den Dateistrom zu schließen.
Große Datei -Hash -Berechnung <br> Bei der Verarbeitung großer Dateien (z. B. Dateien größer als 1 GB) können Dateien nicht sofort in den Speicher geladen werden. Zu diesem Zeitpunkt kann das Lesen der Datei in Stücken und die Berechnung des Hash -Werts effektiv reduzieren.
Dateiintegritätsprüfung <br> Für Szenarien, in denen Dateiinhalte sichergestellt werden müssen, dass der Inhalt der Dateien während der Übertragung nicht manipuliert wird, ist es sehr wichtig, die Integrität von Dateien über Hash -Werte zu überprüfen.
Passen Sie die Blockgröße <br> dynamisch an Die Größe des Leseblocks kann gemäß der Speicher- und Festplattenleistung des Systems angepasst werden. Die Auswahl der entsprechenden Blockgröße kann die Leistung weiter verbessern.
Multithread -Verarbeitung <br> Für sehr große Dateien können Sie in Betracht ziehen, Multithreading -Technologie zu verwenden, um verschiedene Teile der Datei gleichzeitig zu verarbeiten, um die Effizienz weiter zu verbessern.
Zu große Dateien führen zu unzureichender Speicher <br> Wenn Sie Streaming zum Lesen von Dateien und zum Aktualisieren des Hash -Werte -Chunk -Chunks für Chunk selbst verwenden, ist die Datei selbst nicht vollständig in den Speicher geladen, wodurch Probleme mit dem Speicherüberlauf vermieden werden.
Dateiformate, die nicht von der Funktion von Hash_Update_Stream unterstützt werden <br> Diese Funktion übernimmt Binärdatenströme, sodass sie zum Verarbeiten jeder Dateiart, einschließlich Textdateien, Bildern, Videos usw., verwendet werden kann.
PHP-offizielles Dokument: https://www.php.net/manual/zh/function.hash-update-stream.php