Bei der Verwendung von PHP -Zip -Erweiterung zu verarbeitungskomprimierten Paketen von Reißverschluss sind ZIP_READ () und ZIP_ENTRY_READ () zwei Funktionen, die häufig zusammen verwendet werden. Viele Entwickler stoßen jedoch auf ein verwirrendes Problem, wenn Sie IT -IT -IT -Eintrag mit ZIP_READ () verwenden und den Inhalt dann über Zip_entry_read () lesen, ein Fehler wird gemeldet und sogar leeren Inhalt oder verstümmelten Code werden zurückgegeben. Was verursacht das? In diesem Artikel wird die ausführlichen Gründe analysiert und Lösungen bereitgestellt.
Betrachten Sie den folgenden Code:
$zip = zip_open('http://m66.net/test.zip');
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
echo 'Lesendatei: ' . zip_entry_name($entry) . PHP_EOL;
if (zip_entry_open($zip, $entry)) {
$contents = zip_entry_read($entry);
echo $contents . PHP_EOL;
zip_entry_close($entry);
}
}
zip_close($zip);
}
Beim Ausführen des obigen Code kann der folgende Fehler auftreten:
Warning: zip_entry_read(): supplied resource is not a valid Zip Entry resource in...
Oder der gelesene Inhalt ist leer, was wie erwartet völlig unerfüllt ist.
Die Grundursache für dieses Problem ist normalerweise eine der folgenden:
Obwohl ZIP_OPEN () das Übergeben in einem Dateipfad unterstützt, unterstützt es nicht unbedingt Remote -URLs . Wie im obigen Beispiel verwendet, hängt http://m66.net/test.zip davon ab, ob Ihr PHP erlaubt hat. In den meisten Fällen benötigt Zip_open () eine lokale Datei, die direkt suchen kann.
ZIP_ENTRY_READ () muss die Länge des Lesens angeben. Wenn die Länge nicht angegeben ist, wird standardmäßig 1024 -Bytes angezeigt, wodurch unvollständige Inhalte verursacht werden, wenn die Datei groß ist. Und wenn die Datei leer oder falsch ist, kann sie direkt fehlschlagen.
Beim Öffnen eines Eintrags mit zip_entry_open () wird der nachfolgende zip_entry_read () nicht ausgeführt, wenn er fehlschlägt. Darüber hinaus haben einige Versionen von PHP Kompatibilitätsprobleme beim Umschalten von Lesevorgängen zwischen mehreren Einträgen, insbesondere wenn die Komprimierungsmethode nicht gespeichert oder entleert wird.
Um sicherzustellen, dass die Zip -Einträge korrekt gelesen werden, sollten die folgenden Schritte befolgt werden:
$localFile = 'test.zip';
copy('http://m66.net/test.zip', $localFile); // Laden Sie Remotedateien lokal herunter
$zip = zip_open($localFile);
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
$name = zip_entry_name($entry);
echo "Lesen Sie die Datei: $name" . PHP_EOL;
if (zip_entry_open($zip, $entry)) {
$size = zip_entry_filesize($entry);
$contents = zip_entry_read($entry, $size);
echo "Inhalt: " . PHP_EOL . $contents . PHP_EOL;
zip_entry_close($entry);
} else {
echo "Einen Eintrag kann nicht geöffnet werden: $name" . PHP_EOL;
}
}
zip_close($zip);
}
Hier sind ein paar wichtige Punkte:
Laden Sie zuerst den Remote -Reißverschluss in den lokalen Bereich herunter und öffnen Sie dann Zip_open (), um die lokale Datei zu öffnen.
Verwenden Sie ZIP_ENTRY_FILESIZE (), um die richtige Leselänge zu erhalten.
Überprüfen Sie immer, ob zip_entry_open () true zurückgibt.
Die Hauptgründe für die Verwendung von ZIP_READ (), um Fehler zu melden, sind normalerweise die Ressourcenöffnungsmethode, die Leselänge wird nicht korrekt angegeben oder der Remote -Pfad wird nicht ordnungsgemäß behandelt. Es wird empfohlen, immer den lokalen Dateipfad zu verwenden und den Inhalt genau mit ZIP_ENTRY_FILESIZE () zu lesen. Wenn Sie höhere Anforderungen haben, können Sie auch in Betracht ziehen, die Ziparchive -Klasse zu verwenden, die eine erweitertere und stabilere Schnittstelle bietet.
Durch den richtigen Prozess kann das Lesen von Zip -Dateien sicherer, stabiler und effizienter gemacht werden.