Position actuelle: Accueil> Derniers articles> Pourquoi la prochaine entrée de fichier ne peut-elle pas être lue lors de l'utilisation de zip_read ()? Qu'est-ce qui ne va pas?

Pourquoi la prochaine entrée de fichier ne peut-elle pas être lue lors de l'utilisation de zip_read ()? Qu'est-ce qui ne va pas?

M66 2025-06-23

Lorsque vous utilisez PHP pour manipuler des fichiers compressés Zip, zip_read () est une fonction commune pour lire la prochaine entrée de fichier dans le package compressé. Cependant, certains développeurs ont constaté qu'en fonctionnement réel, zip_read () renvoie toujours FAUX , ce qui entraîne le défaut de lire correctement le fichier suivant. Ce problème peut provenir de plusieurs aspects, analysons-le un par un.

1. La bonne façon de l'ouvrir

Tout d'abord, vous devez vous assurer d'ouvrir le fichier zip de la bonne façon. Le processus de lecture standard est le suivant:

 $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);
}

La clé ici est que l'appel à zip_read ($ zip) doit être exécuté après que zip_open () renvoie la ressource.

2. Utilisez des erreurs de zip_entry_open ()

De nombreux développeurs croient à tort qu'après zip_read () , appelez simplement zip_entry_open () pour ouvrir l'entrée actuelle, et après la lecture, PHP traitera automatiquement le curseur et passera au fichier suivant.

En fait, ce n'est pas le cas. Une erreur très courante est:

 while ($entry = zip_read($zip)) {
    if (zip_entry_open($zip, $entry, "r")) {
        $data = zip_entry_read($entry);
        zip_entry_close($entry);
    }
}

Si vous ne lisez qu'une partie des données ou si la lecture échoue, la prochaine fois que vous appelez zip_read () , elle peut toujours être coincée dans l'entrée actuelle. Assurez-vous de lire à la fin du fichier, ou fermez l'entrée correctement avant de continuer à la suivante.

3. Problèmes avec le fichier zip lui-même

Il est également possible que le problème réside dans le fichier zip. Bien que certains fichiers zip puissent être ouverts normalement, certaines entrées peuvent être corrompues ou avoir des structures irrégulières. Par exemple:

  • Le nom du fichier contient des caractères spéciaux

  • Les informations d'en-tête d'entrée sont corrompues

  • De nouveaux algorithmes de compression sont utilisés et l'extension ZIP de PHP ne prend pas en charge

Il est recommandé d'utiliser Zipinfo ou d'autres outils pour afficher l'intégrité du fichier zip. Vous pouvez également utiliser la ligne de commande pour tester:

 unzip -t archive.zip

Cette commande répertorie les résultats du test pour chaque entrée.

4. Problèmes de compatibilité des versions

zip_read () appartient à l'ancienne extension zip (versions précédentes de libzip). Si vous utilisez PHP 7.4 ou version ultérieure, vous pouvez avoir obsolète l'ancienne API ZIP. Il est recommandé d'utiliser la classe ziparchive à la place, qui fournit une interface plus stable et moderne:

 $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();
}

Par rapport à zip_read () , Ziparchive est plus facile à dépanner les erreurs et a des fonctions plus riches, telles que la prise en charge de la protection par mot de passe, la décompression en streaming, la lecture des attributs de fichiers, etc.

5. Exemple: Lisez tous les fichiers et les diffuser dans le lien de nom de domaine spécifié

Si vous souhaitez sortir chaque entrée de fichier ZIP et générer un chemin lié à un nom de domaine (tel que m66.net ), vous pouvez le faire:

 $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);
}

Veuillez noter qu'ici, nous générons simplement le lien et n'en extrait pas le fichier. Pour accéder à https://m66.net/files/xxx , vous devez réellement décompresser le contenu dans le zip vers ce répertoire sur le serveur.

en conclusion

Si vous ne pouvez pas lire l'entrée de fichier suivante lorsque vous utilisez zip_read () :

  • Vérifiez que chaque entrée est lue correctement et se ferme;

  • Confirmez que le fichier zip n'est pas corrompu ou que les fonctionnalités non prises en charge par PHP sont utilisées;

  • Essayez de remplacer l'ancienne fonction ZIP par Ziparchive ;

  • Assurez-vous que la logique du code est terminée, en particulier lors du traitement des boucles, faites attention aux conditions de sortie.

Bien que zip_read () semble simple, il est en fait sujet aux erreurs. Ce n'est qu'en comprenant ses principes et alternatives sous-jacents que vous pouvez éviter de rester coincé et rendre votre logique de traitement de fichier zip plus robuste.