Introdução ao trabalho com arquivos ZIP em PHP
Os arquivos ZIP continuam sendo um dos formatos de compressão de dados mais populares no desenvolvimento web. Em PHP, o trabalho com eles é implementado nativamente através da extensão Zip, que fornece a poderosa classe ZipArchive. Isso permite que desenvolvedores criem, leiam, atualizem e extraiam arquivos de arquivos compactados facilmente, sem a necessidade de instalar bibliotecas de terceiros adicionais.
No portal educacional PythonLib.ru, abordaremos todos os aspectos do trabalho com ZIP em PHP: desde operações básicas até técnicas avançadas, incluindo compressão com senha, processamento de grandes volumes de dados e integração com buffer de saída.
Instalação e verificação da extensão Zip
A classe ZipArchive está disponível em PHP a partir da versão 5.2.0. Para utilizá-la, é necessário garantir que a extensão zip esteja habilitada na configuração do servidor. Isso pode ser verificado com a função phpinfo() ou com um script simples:
<?phpif (class_exists('ZipArchive')) { echo "Extensão Zip disponível";} else { echo "Extensão Zip não instalada";}?>Na maioria das hospedagens modernas, a extensão já vem pré-instalada. Se não estiver, entre em contato com o administrador do servidor ou instale-a através do gerenciador de pacotes (por exemplo, apt-get install php-zip para Debian/Ubuntu).
Operações básicas com ZipArchive
1. Criando um novo arquivo ZIP
Para criar um arquivo, utiliza-se o método open() com a flag ZipArchive::CREATE. Vejamos um exemplo básico:
<?php$zip = new ZipArchive();$filename = 'example.zip';
if ($zip->open($filename, ZipArchive::CREATE) === TRUE) { // Adicionando um arquivo a partir de uma string $zip->addFromString('hello.txt', 'Olá, mundo!'); // Adicionando um arquivo existente $zip->addFile('/path/to/image.jpg', 'images/photo.jpg'); // Adicionando um diretório vazio $zip->addEmptyDir('documents'); $zip->close(); echo "Arquivo criado com sucesso";} else { echo "Erro ao criar o arquivo";}?>Observe: o segundo parâmetro de addFile() define o caminho dentro do arquivo, permitindo organizar a estrutura de pastas.
2. Extraindo um arquivo ZIP
Para extrair todos os arquivos, utiliza-se o método extractTo():
<?php$zip = new ZipArchive();if ($zip->open('example.zip') === TRUE) { $zip->extractTo('/destination/folder/'); $zip->close(); echo "Arquivo extraído";} else { echo "Não foi possível abrir o arquivo";}?>Também é possível extrair apenas um arquivo específico, informando seu caminho interno como segundo argumento:
$zip->extractTo('/destination/', 'images/photo.jpg');3. Lendo o conteúdo do arquivo sem extrair
Às vezes, é necessário apenas visualizar a lista de arquivos dentro do arquivo:
<?php$zip = new ZipArchive();if ($zip->open('archive.zip') === TRUE) { for ($i = 0; $i < $zip->numFiles; $i++) { $stat = $zip->statIndex($i); echo "Arquivo: " . $stat['name'] . " (tamanho: " . $stat['size'] . " bytes)"; } $zip->close();}?>O método statIndex() retorna um array com informações: nome, tamanho, data de modificação, CRC32 e outros metadados.
Recursos avançados
Compressão com senha (PHP 7.2+)
A partir do PHP 7.2, o ZipArchive suporta criptografia com senha através do algoritmo AES-256:
<?php$zip = new ZipArchive();if ($zip->open('protected.zip', ZipArchive::CREATE) === TRUE) { $zip->setPassword('supersecret'); $zip->addFile('document.pdf'); // Ativando a criptografia para o último arquivo adicionado $zip->setEncryptionName('document.pdf', ZipArchive::EM_AES_256); $zip->close(); echo "Arquivo criptografado criado