zip_entry_read()
A função zip_entry_read() era usada para ler o conteúdo de um arquivo em um arquivo zip. Removida no PHP 8.0; use ZipArchive hoje.
A função zip_entry_read() era uma função interna do PHP usada para ler o conteúdo de um único arquivo (uma entrada) dentro de um arquivo zip aberto, um bloco de bytes de cada vez. Ela retornava os dados lidos como uma string.
Importante: Toda a família procedural zip_entry_* — incluindo zip_entry_read() — foi descontinuada no PHP 7.4 e removida no PHP 8.0. Não há substituto direto; em vez disso, o PHP moderno lê entradas zip por meio da classe orientada a objetos ZipArchive. Esta página documenta a função legada para referência e, em seguida, apresenta a abordagem com ZipArchive que você deve usar atualmente. Para trabalhar com arquivos zip, a extensão zip deve estar habilitada na sua compilação do PHP.
Sintaxe (Legada)
string zip_entry_read(resource $zip_entry, int $length = 1024)| Parâmetro | Descrição |
|---|---|
$zip_entry | O identificador de entrada retornado por zip_entry_open() após o arquivo ter sido aberto com zip_open() e uma entrada obtida de zip_read(). |
$length | Opcional. O número de bytes a serem lidos. Como as entradas zip são armazenadas de forma comprimida, este é o número de bytes descomprimidos retornados. O padrão é 1024. |
Valor de retorno: o conteúdo lido como uma string, ou false em caso de falha. Assim como a leitura de um arquivo, chamadas repetidas avançam pela entrada até que ela seja esgotada.
Lendo uma entrada zip com ZipArchive (moderno)
O substituto mais limpo é ZipArchive::getFromName(), que retorna o conteúdo inteiro descomprimido de uma entrada pelo seu nome de arquivo — sem loop manual de abrir/ler/fechar por entrada.
Lendo um arquivo de um arquivo zip em 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.";
}Aqui, open() retorna true em caso de sucesso (também pode retornar um código de erro, então compare estritamente com === true). getFromName() descomprime e retorna a entrada inteira em uma única chamada. Use getFromIndex($i) quando quiser a entrada em uma posição numérica em vez de pelo nome.
Iterando sobre todas as entradas
Uma tarefa comum é ler todos os arquivos de um arquivo zip. numFiles fornece a contagem de entradas e statIndex() fornece os metadados 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();
}Transmitindo entradas grandes
getFromName() carrega toda a entrada na memória. Para um arquivo grande, abra a entrada como um stream e leia-a em blocos — este é o verdadeiro equivalente moderno do comportamento em blocos do 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();
}O stream retornado é um recurso de stream PHP comum, portanto funções familiares como fread() e feof() funcionam diretamente nele.
Quando eu usaria isso?
- Lendo arquivos de configuração ou templates enviados dentro de um
.zipsem extraí-los para o disco. - Inspecionando um upload (por exemplo, um
.docxou.xlsx, que são contêineres zip) entrada por entrada. - Processando logs arquivados grandes por streaming em vez de descompactar tudo primeiro.
Se você precisar apenas dos bytes de um único arquivo e não se importa que ele esteja em um zip, extraí-lo primeiro e usar file_get_contents() também é uma opção válida.
Conclusão
zip_entry_read() pertencia à API zip procedural legada do PHP, que foi descontinuada na versão 7.4 e removida na 8.0. Em qualquer versão PHP suportada, leia entradas zip com a classe ZipArchive: use getFromName() / getFromIndex() para entradas completas, itere com numFiles e use getStream() com fread() quando uma entrada for grande demais para ser mantida na memória de uma vez.