Lorsque vous utilisez l'extension ZIP de PHP pour traiter les packages compressés ZIP, ZIP_READ () et ZIP_ENTRY_READ () sont deux fonctions qui sont souvent utilisées ensemble. Cependant, de nombreux développeurs rencontrent un problème déroutant lors de l'utilisation d'idéter l'entrée avec zip_read () , puis de lire le contenu via ZIP_ENTRY_READ () , une erreur sera signalée, et même du contenu vide ou du code brouillé sera renvoyé. Qu'est-ce qui cause cela? Cet article analysera les raisons en profondeur et fournira des solutions.
Considérez le code suivant:
$zip = zip_open('http://m66.net/test.zip');
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
echo 'Fichier de lecture: ' . 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);
}
Lors de l'exécution du code ci-dessus, l'erreur suivante peut se produire:
Warning: zip_entry_read(): supplied resource is not a valid Zip Entry resource in...
Ou la lecture du contenu est vide, ce qui est complètement non satisfait comme prévu.
La cause profonde de ce problème est généralement l'un des éléments suivants:
Bien que Zip_Open () prenne en charge le passage d'un chemin de fichier, il ne prend pas nécessairement en charge les URL distantes . Tel qu'utilisé dans l'exemple ci-dessus, http://m66.net/test.zip dépend de la question de savoir si votre PHP a activé Autor_URL_FOPEN et si l'extension ZIP sous-jacente prend en charge la lecture correcte des données zip à partir de ressources en streaming. Dans la plupart des cas, zip_open () nécessite un fichier local qui peut être directement recherché.
zip_entry_read () doit spécifier la longueur de la lecture. Si la longueur n'est pas spécifiée, elle lira 1024 octets par défaut, ce qui entraînera un contenu incomplet lorsque le fichier est grand; Et si le fichier est vide ou incorrect, il peut échouer directement.
Lors de l'ouverture d'une entrée à l'aide de zip_entry_open () , le zip_entry_read () ultérieur ne sera pas exécuté en cas d'échec. De plus, certaines versions de PHP ont des problèmes de compatibilité lors de la commutation de lecture entre plusieurs entrées, surtout si la méthode de compression n'est pas stockée ou ne dégonfle pas.
Pour s'assurer que les entrées zip sont lues correctement, les étapes suivantes doivent être suivies:
$localFile = 'test.zip';
copy('http://m66.net/test.zip', $localFile); // Télécharger les fichiers distants localement
$zip = zip_open($localFile);
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
$name = zip_entry_name($entry);
echo "Lire le fichier: $name" . PHP_EOL;
if (zip_entry_open($zip, $entry)) {
$size = zip_entry_filesize($entry);
$contents = zip_entry_read($entry, $size);
echo "contenu: " . PHP_EOL . $contents . PHP_EOL;
zip_entry_close($entry);
} else {
echo "Impossible d'ouvrir une entrée: $name" . PHP_EOL;
}
}
zip_close($zip);
}
Voici quelques points clés:
Téléchargez d'abord le zip distant dans la zone locale , puis utilisez zip_open () pour ouvrir le fichier local;
Utilisez zip_entry_filesize () pour obtenir la longueur de lecture correcte;
Vérifiez toujours si zip_entry_open () renvoie true .
Les principales raisons d'utiliser zip_read () pour signaler les erreurs sont généralement la méthode d'ouverture des ressources, la longueur de lecture n'est pas spécifiée correctement ou le chemin distant n'est pas géré correctement. Il est recommandé d'utiliser toujours le chemin du fichier local et de lire avec précision le contenu avec zip_entry_filesize () . Si vous avez des demandes plus élevées, vous pouvez également envisager d'utiliser la classe Ziparchive , qui fournit une interface plus avancée et stable.
Grâce au processus correct, la lecture des fichiers zip peut être rendue plus sûre, plus stable et plus efficace.