W3docs

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 PECL ext-zip y solo están disponibles en PHP 7.4 y versiones anteriores. Para aplicaciones PHP modernas, se recomienda la clase ZipArchive.

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 y false termina el bucle. Pero un código de error entero también se devuelve en caso de fallo — verifique is_resource($zip) después de zip_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 ZipArchive en 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.

Práctica

Práctica
¿Para qué se usa la función zip_read() en PHP?
¿Para qué se usa la función zip_read() en PHP?
Was this page helpful?