Bom dia, querido Habr!
Nos últimos meio ano, o caminho tortuoso dos meus projetos de animais de estimação me levou a uma selva, de onde ainda não é possível sair. E tudo começou de forma inofensiva - um site com fotos, mas um senso de perfeccionismo, a busca de um brinde, além de algumas características da minha mentalidade, que transformaram essa caminhada, como planejada originalmente, em uma jornada realmente longa. Bem, tudo bem, como costumava dizer um revolucionário bastante burry: "Aprenda, estude e estude novamente", mas eu, quer ou não, tenho que seguir essa advertência.
Oh, algo que nos distraí do tópico principal. Não vou mais aborrecê-lo com discursos longos, mas vou direto ao assunto.
Crie um arquivo zip
Em princípio, não vou reescrever a
especificação aqui. No geral, também não faz sentido descrever a estrutura, porque tudo isso foi
feito antes de mim .
Para quem tem preguiça de seguir os links, descreverei brevemente que qualquer arquivo zip deve conter:
- Entrada do arquivo:
- Cabeçalho do arquivo local
- Dados úteis
- Descritor de dados (opcional, usado quando não sabemos o tamanho do arquivo e seu hash até o lermos até o final)
- Cabeçalho de arquivo do diretório central (para cada arquivo. É como um sumário do livro, onde cada seção e página na qual ele pode ser encontrado)
- Fim do diretório central
Sabendo disso, podemos tentar escrever um arquivo simples que conterá apenas dois arquivos:
<?php
Tente executar esse código primitivo e a saída fornecerá um arquivo Lorem.zip que conterá 1.txt e 2.txt.
Porque
Obviamente, qualquer pessoa adequada dirá que escrever arquivadores em php é uma tarefa fútil, especialmente porque para um formato como zip, existem várias implementações prontas para todos os gostos e cores. E no mesmo php existem bibliotecas prontas. Eu vou dizer isso também :)
Mas por que, então, é este artigo inteiro, por que gastei tempo escrevendo e você lendo?
E então, que tudo não é tão simples e saber como o zip funciona, abre algumas possibilidades adicionais para nós.
Em primeiro lugar, espero, pelo menos um pouco, mas ajudará aqueles que querem entender a estrutura do zip.
E, em segundo lugar, criando o arquivo com nossas próprias mãos, temos controle e, mais importante, acesso aos seus dados internos.
Podemos pré-calcular o cabeçalho do arquivo local e o cabeçalho do arquivo do diretório central e, a pedido, gerar um arquivo zip em tempo real com qualquer conteúdo e ordem dos arquivos, simplesmente substituindo esses dados. E sem sobrecarga, exceto E / S.
Ou então, podemos gravar o arquivo morto, carregá-lo, por exemplo, na nuvem, que suporta downloads fragmentados e, conhecendo as compensações de cada arquivo, obter qualquer um deles, como se não estivesse no arquivo, adicionando apenas um título para a solicitação. E então tudo isso pode ser procurado e ...
Ok, não vamos nos antecipar. Se você estiver interessado neste tópico, nos artigos a seguir tentarei considerar essas oportunidades e mostrar como usá-las.
'diskNumber' => 0, // Eu geralmente encontrei 0 em todos os lugares e, em particular, decidi não me aprofundar
Como
berez sugeriu, o número do volume no arquivo múltiplo.