zip_read()
La función zip_read() lee entradas de un archivo zip abierto en PHP. Disponible solo en PHP 7.4 y anteriores.
⚠️ Aviso de API obsoleta: La función
zip_read()y las funciones procedurales de zip relacionadas fueron eliminadas en PHP 8.0. Requieren la extensión PECLext-zipy solo están disponibles en PHP 7.4 y versiones anteriores. Para aplicaciones PHP modernas, se recomienda la claseZipArchive.
La función zip_read() lee la siguiente entrada (un archivo o registro de directorio individual) de un archivo zip abierto. Forma parte de la API procedural de zip heredada de PHP, donde se recorre el archivo una entrada a la vez: se abre el archivo con zip_open(), se llama a zip_read() repetidamente para avanzar por las entradas y luego se cierra con zip_close().
Cada llamada exitosa devuelve un recurso de entrada zip — un manejador que se pasa a las funciones zip_entry_* para inspeccionar o leer esa entrada. Cuando no hay más entradas, zip_read() devuelve false, lo que termina el bucle. En caso de error, devuelve el número de un código de error.
Sintaxis
La sintaxis de la función zip_read() es la siguiente:
Sintaxis de la función zip_read() en PHP
resource|int|false zip_read(resource $zip)$zip es el recurso del archivo devuelto por zip_open(). El valor de retorno es uno de los siguientes:
- un recurso de entrada zip — hay una entrada para procesar;
false— se ha llegado al final del archivo;- un código de error entero — algo salió mal al leer el archivo.
¿Por qué iterar con zip_read()?
La API procedural es un cursor de avance único: no hay una llamada para "listar todas las entradas". Se lee una entrada, se realiza alguna acción con ella (obtener su nombre y tamaños, o extraer su contenido) y luego se solicita la siguiente. Esto mantiene bajo el uso de memoria porque solo una entrada está en el ámbito a la vez, pero también significa que no se puede saltar a una entrada arbitraria — hay que recorrerlo desde el principio.
Ejemplos de uso
Ejemplo: Listar las entradas de un archivo Zip
Este bucle abre un archivo y muestra metadatos de cada entrada que contiene:
Lectura de las entradas de un archivo Zip en PHP
$zip = zip_open("example.zip");
if (!is_resource($zip)) {
throw new RuntimeException("Failed to open zip archive (error code: $zip)");
}
while ($zip_entry = zip_read($zip)) {
echo "Name: " . zip_entry_name($zip_entry) . "\n";
echo "Compressed Size: " . zip_entry_compressedsize($zip_entry) . "\n";
echo "Uncompressed Size: " . zip_entry_filesize($zip_entry) . "\n";
}
zip_close($zip);El código abre example.zip con zip_open(), luego itera mientras zip_read() devuelve recursos de entrada. Para cada entrada muestra el nombre con zip_entry_name(), el tamaño almacenado con zip_entry_compressedsize() y el tamaño original con zip_entry_filesize(). Finalmente zip_close() libera el archivo.
Ejemplo: Leer el contenido de una entrada
zip_read() solo posiciona en una entrada; para leer los bytes reales hay que abrir la entrada con zip_entry_open() y obtener los datos con zip_entry_read():
$zip = zip_open("example.zip");
if (is_resource($zip)) {
while ($entry = zip_read($zip)) {
if (zip_entry_open($zip, $entry, "r")) {
$contents = zip_entry_read($entry, zip_entry_filesize($entry));
echo zip_entry_name($entry) . ":\n" . $contents . "\n";
zip_entry_close($entry);
}
}
zip_close($zip);
}Problemas comunes
- Veracidad del bucle.
while ($entry = zip_read($zip))funciona porque un recurso válido es verdadero yfalsetermina el bucle. Pero un código de error entero también se devuelve en caso de fallo — verifiqueis_resource($zip)después dezip_open()para nunca iterar sobre un manejador roto. - Solo se puede leer hacia adelante. No hay rebobinado. Para procesar el archivo de nuevo, ábralo de nuevo con
zip_open(). - Eliminado en PHP 8. Estas funciones fueron eliminadas en PHP 8.0. El código que deba ejecutarse en PHP moderno debe usar la clase orientada a objetos
ZipArchiveen su lugar.
Alternativa moderna: ZipArchive
En PHP 8 y versiones posteriores, itere un archivo con la clase ZipArchive. También ofrece acceso aleatorio por índice, lo que zip_read() no puede:
$zip = new ZipArchive();
if ($zip->open("example.zip") === true) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$stat = $zip->statIndex($i);
echo "Name: {$stat['name']}\n";
echo "Compressed Size: {$stat['comp_size']}\n";
echo "Uncompressed Size: {$stat['size']}\n";
}
$zip->close();
}Consulte la descripción general de la extensión PHP Zip para conocer la API completa de ZipArchive.
Conclusión
zip_read() avanza un cursor de solo avance a través de las entradas de un archivo zip abierto con zip_open(), devolviendo un recurso de entrada zip cada vez y false al final. Es el núcleo del bucle procedural heredado de lectura de zip, junto con las funciones zip_entry_* para inspeccionar y extraer cada entrada. Dado que esta API fue eliminada en PHP 8.0, prefiera ZipArchive para cualquier código destinado a versiones actuales de PHP.