W3docs

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âmetroDescrição
$zip_entryO 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().
$lengthOpcional. 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 .zip sem extraí-los para o disco.
  • Inspecionando um upload (por exemplo, um .docx ou .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.

Prática

Prática
No PHP 8.0+, qual é a forma correta de ler o conteúdo de um único arquivo de um ZipArchive aberto?
No PHP 8.0+, qual é a forma correta de ler o conteúdo de um único arquivo de um ZipArchive aberto?
Was this page helpful?