Bei der Verarbeitung großer Dateien wird die Funktion von PHP häufig zum Hash-Inhalt von Hash_Update verwendet, z. B. die Berechnung von Hash-Werten wie MD5, SHA-1 oder sicherer SHA-256. Die direkte Verwendung von Hash_Update kann jedoch auf Leistungs Engpässe für große Dateien begegnen, die sich hauptsächlich als übermäßigem Speicherverbrauch oder langsamer Rechengeschwindigkeit manifestieren. In diesem Artikel werden verschiedene effektive Möglichkeiten zur Verbesserung der Leistung von Hash_Update mit Beispielcode untersucht.
Lesen Sie die gesamte Datei direkt in den Speicher und dann kann sie einen Speicherüberlauf oder eine Ineffizienz verursachen. Die Best Practice ist die Verwendung von Chunked Reading -Methoden, um Daten allmählich an Hash_Update zu übergeben.
<?php
$filename = '/path/to/large/file.zip';
$context = hash_init('sha256');
$handle = fopen($filename, 'rb');
if ($handle === false) {
die('Failed to open file');
}
while (!feof($handle)) {
$buffer = fread($handle, 8192); // 8KB Jeweils lesen
hash_update($context, $buffer);
}
fclose($handle);
$hash = hash_final($context);
echo "File hash: $hash\n";
?>
Hier wird eine 8 -KB -Puffergröße verwendet, die gemäß dem Systemspeicher und der IO -Leistung angepasst werden kann.
Die Puffergröße wirkt sich direkt auf die Lese- und Schreibleistung aus. Zu klein führt zu einer großen Menge an IO -Operationen, und zu groß wird zu viel Speicher in Anspruch nehmen. Im Allgemeinen ist 8 KB bis 64 KB eine gute Wahl. Die beste Leistung kann getestet werden, indem der zweite Parameter von Fread eingestellt wird.
Die mit PHP gelieferte Hash_File -Funktion ist in der zugrunde liegenden Implementierung in der Regel effizienter als das Lesen von Block nach Block von PHP -Skripten. Wenn Sie einfach den Hash -Wert berechnen, können Sie ihn direkt verwenden:
<?php
$hash = hash_file('sha256', '/path/to/large/file.zip');
echo "File hash: $hash\n";
?>
Bei dieser Methode müssen Sie keine Dateizeiger selbst verwalten, und sie wird auch besser in der Leistung erfolgen.
Wenn die Umgebung zulässt, können Sie die Datei in mehrere Teile aufteilen und mehrere Prozesse oder mehrere Threads verwenden, um den Hash für jeden Teil separat zu berechnen und schließlich die Ergebnisse zu verschmelzen (z. B. durch Anpassen oder Verschmelzung von partiellem Hash). PHP unterstützt Multithreading nicht nativ, kann aber mit PCNTL_FORK oder externen Erweiterungen implementiert werden.
Diese Lösung ist jedoch komplex und hat spezielle Anforderungen für die Implementierung von Hashing -Algorithmus und ist in der Regel für besonders große Dateien und spezielle Szenarien geeignet.
Wenn sich die Datei nicht häufig ändert, können Sie den Hash -Wert der Datei für den Cache in Betracht ziehen, um wiederholte Berechnungen zu reduzieren.
Speichern Sie beispielsweise zuerst die letzte Änderungszeit und den Hash -Wert der Datei:
<?php
$filename = '/path/to/large/file.zip';
$cacheFile = '/tmp/file_hash_cache.json';
$cache = json_decode(file_get_contents($cacheFile) ?: '{}', true);
$filemtime = filemtime($filename);
if (isset($cache[$filename]) && $cache[$filename]['mtime'] === $filemtime) {
$hash = $cache[$filename]['hash'];
} else {
$hash = hash_file('sha256', $filename);
$cache[$filename] = ['mtime' => $filemtime, 'hash' => $hash];
file_put_contents($cacheFile, json_encode($cache));
}
echo "File hash: $hash\n";
?>
Dies vermeidet jedes Mal den Hash neu.
Die Leistung verschiedener Hashing -Algorithmen variiert stark. MD5 und SHA-1 sind im Allgemeinen schneller als SHA-256, aber weniger sicher. Wählen Sie den entsprechenden Algorithmus basierend auf der Szenario-Kompromissgeschwindigkeit und den Sicherheitsbedürfnissen.
Blocklesen : Vermeiden Sie es, in Speicher zu lesen, verwenden Sie Blocklesen und rufen Sie Hash_Update an.
Passen Sie die Puffergröße an : Wählen Sie angemessen die Puffergröße, um die IO -Leistung zu verbessern.
Verwenden Sie die Funktion Hash_file : PHP -Hash -Dateifunktion Hash -Dateifunktion mit überlegener Leistung.
Parallele Verarbeitung : Sie können Multi-Process-Sharding-Berechnungen für Super-große Dateien ausprobieren.
Cache -Hash -Ergebnisse : Vermeiden Sie wiederholte Berechnungen unveränderter Dateien.
Wählen Sie den richtigen Algorithmus : Wählen Sie den Hash-Algorithmus basierend auf den Kompromisse für Geschwindigkeit und Sicherheitsverkehr.
Das Mastering dieser Techniken kann die Leistung von PHP -Programmen beim Umgang mit großen Datei -Hashes erheblich verbessern.
<?php
// Beispielcode:Lesen Sie Dateien in Stücken und verwenden Sie sie hash_update berechnen SHA-256
$filename = 'https://gitbox.net/path/to/large/file.zip';
$context = hash_init('sha256');
$handle = fopen($filename, 'rb');
if ($handle === false) {
die('Failed to open file');
}
while (!feof($handle)) {
$buffer = fread($handle, 65536); // 64KB
hash_update($context, $buffer);
}
fclose($handle);
$hash = hash_final($context);
echo "File hash: $hash\n";
?>