Como compactar uma pasta inteira usando PHP
Encontrei aqui no stackoveflow alguns códigos sobre como ZIP um arquivo específico, mas e uma pasta específica?
dentro para dentro My Folder, existem arquivos. depois de fechar o zíper My Folder, eu também quero excluir todo o conteúdo da pasta, exceto important.txt.
Encontrei isso aqui na pilha
Preciso da tua ajuda. obrigado.
— woninana
Tanto quanto posso ver, o link do stackoverflow que você forneceu realmente compacta vários arquivos. Com qual parte você tem problemas?
@lasseespeholt O link que te dei fecha apenas uma arquivo específico, não a pasta e o conteúdo da pasta ..
Ele pega uma matriz de arquivos (essencialmente uma pasta) e adiciona todos os arquivos ao arquivo zip (o loop). Eu posso ver que uma boa resposta foi postada agora +1 :) que é o mesmo código, a matriz é apenas uma lista de arquivos de um diretório agora.
possível duplicata de compressa pasta / arquivo usando o script php
Isso pode ajudá-lo a codingbin.com/compressing-a-directory-of-files-with-php
Código atualizado em 22/04/2015.
Compacte uma pasta inteira:
Compacte uma pasta inteira e exclua todos os arquivos, exceto "important.txt":
— Dador
Você deve definir chmod (gravável) no diretório (onde este script está localizado) como 777. Por exemplo: Se o script estiver localizado em /var/www/localhost/script.php, será necessário definir o chmod 0777 em diretório / var / www / localhost /.
— Dador 06/02
A exclusão dos arquivos antes da chamada $zip->close()não funcionará. Verifique minha resposta aqui
@ alnassre que é requisito da pergunta: "Eu também quero excluir todo o conteúdo da pasta, exceto important.txt". Também aconselho você a sempre ler o código antes de executá-lo.
— Dador 21/04
@alnassre hahahaha ... sorry :) ... hahaha
— Ondrej Rafaj
@ nick-newman, sim, para calcular a porcentagem, você pode usar php.net/manual/ru/function.iterator-count.php + contador dentro do loop. Com relação ao nível de compactação - não é possível com o ZipArchive no momento: stackoverflow.com/questions/1833168/…
Existe um método não documentado útil na classe ZipArchive: addGlob ();
Agora documentado em: www.php.net/manual/en/ziparchive.addglob.php
@netcoder - os benefícios de ter escrito o phpt para testá-lo ... basicamente, leia a fonte da classe ZipArchive e a encontrou lá ... também há um método addPattern () não documentado que usa um padrão de estilo regexp, mas nunca conseguiu que o trabalho (pode ser um bug na classe)
@ kread - você pode usar isso com qualquer lista de arquivos que possa ser extraída usando glob (), então eu achei extremamente útil desde que o descobri.
— 6286 Mark Baker
@ MarkBaker Eu sei que esse comentário está chegando anos depois que você postou, só estou tentando a minha sorte aqui. Também postei uma pergunta aqui sobre como compactar. Estou prestes a experimentar o método glob que você postou aqui, mas meu principal problema é que não posso usar addFromString e uso addFile, que está falhando silenciosamente. Você tem alguma ideia do que pode estar errado ou do que eu posso estar fazendo de errado?
@ user1032531 - a última linha da minha postagem (editada em 13 de dezembro de 2013) indica exatamente isso, com um link para a página de documentos.
É addGlobrecursivo?
— Vincent Poirier
Isso não será compactado recursivamente.
Com certeza apagar alguns arquivos em My folder, mas eu também tenho uma pasta dentro de uma pasta My folderque me dá um erro de: Permissão negada desvinculando a pasta com emMy folder
@ Stupefy: Tente em if (!is_dir($file) && $file != 'target_folder...')vez disso. Ou marque a opção @kread answer se quiser compactar recursivamente, é a maneira mais eficiente.
A pasta dentro do My folderarquivo ainda não foi excluída, mas não há mais erros de qualquer maneira.
— Woninana 6/02
Também esqueci de mencionar que não existem arquivos .zip criados.
Presumo que isso esteja sendo executado em um servidor em que o aplicativo zip esteja no caminho de pesquisa. Deve ser verdade para todos os baseados em unix e acho que a maioria dos servidores baseados em janelas.
O archive residirá em archive.zip posteriormente. Lembre-se de que os espaços em branco nos nomes de arquivos ou pastas são uma causa comum de erros e devem ser evitados sempre que possível.
— Kevin Read
Eu tentei com o código abaixo e está funcionando. O código é auto-explicativo. Entre em contato se tiver alguma dúvida.
Excelente solução. Também funciona no laravel 5.5. realmente gostei disso. (y)
— Web Artisan
Ótimo código! Limpo, simples e funcionando perfeitamente! ;) Parece-me a melhor resposta. Se puder ajudar alguém: acabei de adicionar ini_set('memory_limit', '512M');antes da execução do script e ini_restore('memory_limit');no final. Era necessário evitar a falta de memória no caso de pastas pesadas (era uma pasta maior que 500 MB).
— Jacopo Pace
No meu ambiente (PHP 7.3, Debian), um arquivo ZIP sem uma listagem de diretório foi criado (arquivo grande e vazio). Eu tive que mudar a seguinte linha: $ name. = '/'; em $ name = ($ name == '.'? '': $ name. '/');
Isso está funcionando para mim. Obrigado por compartilhar. Felicidades!
— Sathiska
Esta é uma função que fecha uma pasta inteira e seu conteúdo em um arquivo zip e você pode usá-lo de maneira simples assim:
— Alireza Fallah
Como incluir subpastas também no backup automaticamente com esse script? @Alireza
— floCoder
Por que não tentar o script EFS PhP-ZiP MultiVolume ... Eu compactuei e transferi centenas de shows e milhões de arquivos ... ssh é necessário para criar arquivos efetivamente.
Mas acredito que os arquivos resultantes podem ser usados ​​com o exec diretamente do php:
Não sei se funciona Eu não tentei ...
"o segredo" é que o tempo de execução do arquivamento não deve exceder o tempo permitido para a execução do código PHP.
— ByREV
Este é um exemplo prático de criação de ZIPs em PHP:
— Sun Love
Encontrei este post no google como o segundo melhor resultado, primeiro estava usando exec :(
De qualquer forma, embora isso não atendesse exatamente às minhas necessidades. Decidi postar uma resposta para outras pessoas com minha versão rápida, porém extensa.
Nomeação de arquivos de backup dia a dia, PREFIX-AAAA-MM-DD-POSTFIX.EXTENSION
Relatório de arquivo / ausente
Listagem de backups anterior
Não compacta / inclui backups anteriores;)
Funciona no windows / linux
Enfim, no script .. Embora possa parecer muito .. Lembre-se de que há excesso aqui .. Portanto, sinta-se à vontade para excluir as seções de relatórios conforme necessário ...
Também pode parecer bagunçado também e certas coisas podem ser limpas facilmente ... Portanto, não comente, é apenas um script rápido com comentários básicos lançados .. NÃO PARA USO AO VIVO .. Mas fácil de limpar para uso ao vivo !
Neste exemplo, ele é executado a partir de um diretório que está dentro da pasta raiz www / public_html. Portanto, é necessário apenas subir uma pasta para chegar à raiz.
Ele simplesmente compactará o conteúdo completo da variável $ pathBase e armazenará o zip na mesma pasta. Ele faz uma detecção simples para backups anteriores e os ignora.
Este script eu acabei de testar no linux e funcionou bem em um trabalho cron com o uso de uma URL absoluta para o pathBase.
Eu também excluído o script de exclusão, você pode ver a resposta aceite para este
Tem que amar aqueles votos aleatórios sem um comentário explicando o porquê.
— Waqar Alamgir
Use isso está funcionando bem.
— Indrajeet Singh
Crie uma pasta zip no PHP.
Método de criação de zip
Chame o método zip
— Mamun Sabuj
Eu fiz uma pequena melhoria no script.
— Poohspear
Esta não zip os arquivos, mas a listagem de diretório se foi ele dose não tem diretório mais
— Sujay sreedhar
Isso resolverá seu problema. Por favor tente.
Para quem está lendo este post e procura um porquê compactar os arquivos usando addFile em vez de addFromString, que não compacta os arquivos com seu caminho absoluto (apenas fecha os arquivos e nada mais), veja minha pergunta e resposta aqui