Aktueller Standort: Startseite> Neueste Artikel> Warum kann der nächste Dateieintrag nicht gelesen werden, wenn sie zip_read () verwendet werden? Was ist schief gelaufen?

Warum kann der nächste Dateieintrag nicht gelesen werden, wenn sie zip_read () verwendet werden? Was ist schief gelaufen?

M66 2025-06-23

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.

1. Die richtige Art, es zu öffnen, um es zu öffnen

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.

2. Verwenden Sie Fehler von ZIP_ENTRY_OPEN ()

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.

3. Probleme mit der ZIP -Datei selbst

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.

4.. Versionskompatibilitätsprobleme

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.

5. Beispiel: Lesen Sie alle Dateien und geben Sie sie auf den angegebenen Domänennamen -Link aus

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.

abschließend

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.