Bei Verwendung von PHP zur Manipulation von Zip -komprimierten Dateien ist ZIP_READ () eine gemeinsame Funktion, um den nächsten Dateieintrag im komprimierten Paket zu lesen. Einige Entwickler haben jedoch festgestellt, dass zip_read () im tatsächlichen Betrieb immer falsch zurückgibt, was dazu führt, dass die nächste Datei nicht korrekt gelesen wird. Dieses Problem kann aus mehreren Aspekten stammen. Lassen Sie es uns nacheinander analysieren.
Zunächst müssen Sie sicherstellen, dass Sie die ZIP -Datei richtig öffnen. Der Standard -Lesevorgang lautet wie folgt:
$zip = zip_open("archive.zip");
if (is_resource($zip)) {
while ($zip_entry = zip_read($zip)) {
echo "Name: " . zip_entry_name($zip_entry) . "\n";
}
zip_close($zip);
}
Der Schlüssel hier ist, dass der Anruf bei ZIP_Read ($ ZIP) nach ZIP_OPEN () die Ressource zurückgibt.
Viele Entwickler glauben fälschlicherweise, dass nach ZIP_READ () einfach Zip_entry_open () aufrufen, um den aktuellen Eintrag zu öffnen, und nach dem Lesen verarbeitet PHP den Cursor automatisch und springt zur nächsten Datei.
Tatsächlich ist dies nicht der Fall. Ein sehr häufiger Fehler ist:
while ($entry = zip_read($zip)) {
if (zip_entry_open($zip, $entry, "r")) {
$data = zip_entry_read($entry);
zip_entry_close($entry);
}
}
Wenn Sie nur einen Teil der Daten lesen oder die Lesen fehlschlägt, kann es beim nächsten Mal zip_read () aufrufen, kann es im aktuellen Eintrag immer noch stecken bleiben. Lesen Sie unbedingt am Ende der Datei ab oder schließen Sie den Eintrag korrekt, bevor Sie den nächsten fortsetzen.
Es ist auch möglich, dass das Problem in der ZIP -Datei liegt. Obwohl einige Zip -Dateien normal geöffnet werden können, können einige der Einträge beschädigt werden oder unregelmäßige Strukturen aufweisen. Zum Beispiel:
Der Dateiname enthält Sonderzeichen
Die Informationen zur Eintrittsheader sind beschädigt
Neue Komprimierungsalgorithmen werden verwendet, und die ZIP -Erweiterung von PHP unterstützt nicht
Es wird empfohlen, Zipinfo oder andere Tools zu verwenden, um die Integrität der ZIP -Datei anzuzeigen. Sie können auch die Befehlszeile verwenden, um zu testen:
unzip -t archive.zip
Dieser Befehl listet die Testergebnisse für jeden Eintrag auf.
ZIP_READ () gehört zur alten Zip -Erweiterung (frühere Versionen von Libzip). Wenn Sie PHP 7.4 oder höher verwenden, haben Sie möglicherweise die alte Reißverschluss -API veraltet. Es wird empfohlen, stattdessen die Ziparchive -Klasse zu verwenden, die eine stabilere und modernere Schnittstelle bietet:
$zip = new ZipArchive;
if ($zip->open('archive.zip') === TRUE) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$entry = $zip->getNameIndex($i);
echo "Entry: $entry\n";
}
$zip->close();
}
Im Vergleich zu ZIP_READ () ist Ziparchive einfacher zu fehlerbehebung und hat reichere Funktionen, z. B. die Unterstützung des Kennworts, Streaming -Dekompression, Lesen des Dateiattributs usw.
Wenn Sie jeden Zip -Dateieintrag ausgeben und einen mit einem Domänennamen verknüpften Pfad (z. B. M66.net ) generieren möchten, können Sie dies tun:
$zip = zip_open("archive.zip");
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
$name = zip_entry_name($entry);
echo "<a href='https://m66.net/files/" . urlencode($name) . "'>$name</a><br>";
}
zip_close($zip);
}
Bitte beachten Sie, dass wir hier nur den Link generieren und die Datei tatsächlich nicht extrahieren. Um auf https://m66.net/files/xxx zuzugreifen, müssen Sie den Inhalt im ZIP zu diesem Verzeichnis auf dem Server tatsächlich dekomprimieren.
Wenn Sie den nächsten Dateieintrag nicht lesen können, wenn Sie zip_read () verwenden:
Überprüfen Sie, ob jeder Eintrag korrekt gelesen wird und schließt.
Bestätigen Sie, dass die ZIP -Datei nicht beschädigt ist oder Merkmale, die von PHP nicht unterstützt werden, verwendet werden.
Versuchen Sie, die alte Zip -Funktion durch Ziparchive zu ersetzen.
Stellen Sie sicher, dass die Codelogik abgeschlossen ist, insbesondere bei der Verarbeitung von Schleifen, achten Sie auf die Ausstiegsbedingungen.
Obwohl ZIP_READ () einfach erscheint, ist es tatsächlich anfällig für Fehler. Nur durch das Verständnis der zugrunde liegenden Prinzipien und Alternativen können Sie vermeiden, dass Sie stecken bleiben und Ihre Zip -Datei -Verarbeitungslogik robuster machen.