Introdução ao trabalho com arquivos ZIP em PHP
A arquivação de dados é uma das tarefas básicas do desenvolvimento web. Seja para backup de banco de dados, empacotamento de arquivos enviados pelo usuário ou exportação de grandes volumes de informações — o formato ZIP continua sendo a solução mais popular e versátil. O PHP fornece a classe nativa ZipArchive, que permite realizar todas as operações principais com arquivos ZIP sem a necessidade de instalar extensões adicionais.
Neste artigo, abordaremos em detalhes como usar o ZipArchive em PHP: desde a criação de um arquivo simples até o processamento de pastas aninhadas e proteção por senha. Todos os exemplos de código estão prontos para uso no seu servidor.
Preparação: verificando a extensão Zip
Antes de começar, certifique-se de que a extensão zip está habilitada no seu servidor. Geralmente, ela vem instalada por padrão nas versões modernas do PHP (7.4+, 8.x). Você pode verificar isso usando a função phpinfo() ou um script simples:
<?phpif (extension_loaded('zip')) { echo 'Extensão Zip disponível';} else { echo 'Extensão Zip não encontrada. Instale-a via php.ini';}?>Criando um arquivo ZIP em PHP
Passo 1. Inicializando o objeto ZipArchive
Para começar, crie uma instância da classe ZipArchive e abra um novo arquivo usando o método open(). O segundo parâmetro — a flag ZipArchive::CREATE — indica que o arquivo será criado do zero (ou sobrescrito, se já existir).
<?php$zip = new ZipArchive();$zipName = 'example.zip';
if ($zip->open($zipName, ZipArchive::CREATE) !== TRUE) { exit("Não foi possível criar o arquivo $zipName");}?>Passo 2. Adicionando arquivos ao arquivo
O método addFile() adiciona um arquivo existente do sistema de arquivos. O primeiro argumento é o caminho para o arquivo, o segundo (opcional) é o nome do arquivo dentro do arquivo ZIP (se quiser renomeá-lo).
<?php// Adicionando um único arquivo$zip->addFile('document.pdf', 'my_document.pdf');
// Adicionando vários arquivos$files = ['photo1.jpg', 'photo2.jpg', 'photo3.jpg'];foreach ($files as $file) { $zip->addFile($file);}?>Passo 3. Adicionando uma pasta inteira mantendo a estrutura
Se precisar empacotar um diretório com todos os arquivos aninhados, use uma travessia recursiva. Aqui está uma função pronta:
<?phpfunction addFolderToZip($zip, $folder, $parentFolder = '') { $files = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($folder), RecursiveIteratorIterator::LEAVES_ONLY );
foreach ($files as $file) { if (!$file->isDir()) { $filePath = $file->getRealPath(); $relativePath = $parentFolder . $file->getFilename(); $zip->addFile($filePath, $relativePath); } }}
// Uso:$zip->addEmptyDir('my_folder'); // criando uma pasta no arquivoaddFolderToZip($zip, '/path/to/source_folder', 'my_folder/');?>Passo 4. Fechando o arquivo
Após adicionar todos os arquivos, feche o arquivo — caso contrário, os dados não serão gravados.
<?php$zip->close();echo "Arquivo $zipName criado com sucesso!";?>Extraindo um arquivo ZIP em PHP
Para extrair arquivos, use o método extractTo(). Especifique a pasta de destino onde os arquivos serão extraídos.
<?php$zip = new ZipArchive();if ($zip->open('example.zip') === TRUE) { $zip->extractTo('/path/to/extract_folder/'); $zip->close(); echo 'Arquivo extraído com sucesso';} else { echo 'Erro ao abrir o arquivo';}?>Recursos avançados do ZipArchive
Adicionando uma string como arquivo
O método addFromString() permite criar um arquivo diretamente a partir de uma str
Também na biblioteca
Filas de Tarefas em Swift: GCD, OperationQueue e Swift Concurrency
Cliente HTTP para C++: as melhores bibliotecas para trabalhar com rede
Tokens JWT em TypeScript: guia completo para trabalhar com JSON Web Tokens
Guia completo do Laravel Passport para PHP: OAuth2 na prática