zip_entry_read()
La función zip_entry_read() era una función integrada de PHP para leer el contenido de un archivo dentro de un archivo zip. Eliminada en PHP 8.0.
La función zip_entry_read() era una función PHP integrada utilizada para leer el contenido de un único archivo (una entrada) dentro de un archivo zip abierto, en fragmentos de bytes a la vez. Devolvía los datos leídos como una cadena de texto.
Importante: Toda la familia procedural zip_entry_* — incluida zip_entry_read() — fue declarada obsoleta en PHP 7.4 y eliminada en PHP 8.0. No existe un reemplazo directo; en cambio, el PHP moderno lee entradas zip a través de la clase orientada a objetos ZipArchive. Esta página documenta la función heredada como referencia y luego muestra el enfoque con ZipArchive que deberías usar hoy en día. Para trabajar con archivos zip, la extensión zip debe estar habilitada en tu instalación de PHP.
Sintaxis (heredada)
string zip_entry_read(resource $zip_entry, int $length = 1024)| Parámetro | Descripción |
|---|---|
$zip_entry | El manejador de entrada devuelto por zip_entry_open() tras abrir el archivo con zip_open() y obtener una entrada con zip_read(). |
$length | Opcional. El número de bytes a leer. Dado que las entradas zip se almacenan comprimidas, este es el número de bytes descomprimidos que se devuelven. Por defecto es 1024. |
Valor de retorno: el contenido leído como una cadena, o false en caso de error. Al igual que al leer un archivo, las llamadas sucesivas avanzan por la entrada hasta agotarla.
Leer una entrada zip con ZipArchive (moderno)
El reemplazo más limpio es ZipArchive::getFromName(), que devuelve el contenido completo descomprimido de una entrada por su nombre de archivo — sin necesidad de un bucle manual de abrir/leer/cerrar por entrada.
Leer un archivo de un archivo zip en PHP
$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
$contents = $zip->getFromName('readme.txt');
$zip->close();
if ($contents !== false) {
echo $contents;
} else {
echo "Entry not found in archive.";
}
} else {
echo "Failed to open archive.";
}Aquí open() devuelve true en caso de éxito (también puede devolver un código de error, por lo que hay que comparar estrictamente con === true). getFromName() descomprime y devuelve toda la entrada en una sola llamada. Usa getFromIndex($i) en su lugar cuando quieras la entrada en una posición numérica en vez de por nombre.
Iterar sobre todas las entradas
Una tarea habitual es leer todos los archivos de un archivo zip. numFiles proporciona el número de entradas y statIndex() proporciona los metadatos de cada entrada:
$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
for ($i = 0; $i < $zip->numFiles; $i++) {
$name = $zip->getNameIndex($i);
$data = $zip->getFromIndex($i);
echo $name . " (" . strlen($data) . " bytes)\n";
}
$zip->close();
}Transmitir entradas grandes
getFromName() carga toda la entrada en memoria. Para un archivo grande, abre la entrada como un flujo y léela en fragmentos — este es el verdadero equivalente moderno del comportamiento en fragmentos de zip_entry_read():
$zip = new ZipArchive();
if ($zip->open('example.zip') === true) {
$stream = $zip->getStream('big-log.txt');
if ($stream) {
while (!feof($stream)) {
$chunk = fread($stream, 8192); // read 8 KB at a time
echo $chunk;
}
fclose($stream);
}
$zip->close();
}El flujo devuelto es un recurso de flujo PHP ordinario, por lo que funciones conocidas como fread() y feof() funcionan sobre él directamente.
¿Cuándo usaría esto?
- Leer archivos de configuración o plantillas distribuidos dentro de un
.zipsin extraerlos al disco. - Inspeccionar una carga (por ejemplo, un
.docxo.xlsx, que son contenedores zip) entrada por entrada. - Procesar registros archivados de gran tamaño transmitiendo en lugar de descomprimir todo primero.
Si solo necesitas los bytes de un único archivo y no te importa que esté en un zip, extraerlo primero y usar file_get_contents() también es una opción válida.
Conclusión
zip_entry_read() pertenecía a la API zip procedural heredada de PHP, que fue declarada obsoleta en 7.4 y eliminada en 8.0. En cualquier versión de PHP compatible, lee entradas zip con la clase ZipArchive: usa getFromName() / getFromIndex() para entradas completas, itera con numFiles, y usa getStream() con fread() cuando una entrada sea demasiado grande para mantenerla en memoria de una vez.