Pergunta

Eu tenho uma grande quantidade de dados para mover usando dois scripts PHP: um no lado do cliente usando um script de linha de comando e outro atrás Apache. I POST os dados para o lado do servidor ea utilização php: // fluxo de entrada para salvá-lo no fim de web-servidor. Para impedir de alcançar quaisquer limites de memória, os dados são separados em pedaços 500KB para cada solicitação POST. Tudo isso muito bem funciona.

Agora, para salvar a largura de banda e acelerá-lo, eu quero comprimir os dados antes de enviar e descomprimir quando recebido na outra extremidade. Eu encontrei 3 pares de funções que podem fazer o trabalho, mas eu não posso decidir qual usar:

Qual par de funções que você recomendaria e por quê?

UPDATE: Acabei de ler FAQ zlib:

O formato gzip (gzencode) foi concebida para reter as informações do diretório sobre um único arquivo, como o nome e data da última modificação. O formato zlib (gzcompress), por outro lado foi projetado para aplicações in-memória e canal de comunicação, e tem um cabeçalho muito mais compacto e reboque e usa uma verificação mais rápida do que a integridade gzip.

Foi útil?

Solução

Todos estes podem ser usados. Há diferenças sutis entre os três:

  • gzencode () usa o arquivo GZIP formato, o mesmo que a ferramenta de linha de comando gzip. Este formato de arquivo tem um cabeçalho contendo metadados opcional, os dados desinflar comprimido, e rodapé contendo uma verificação de checksum CRC32 e comprimento.
  • gzcompress () usa o formato ZLIB . Ele tem um cabeçalho mais curto que serve apenas para identificar o formato de compressão, os dados desinflar comprimido, e um rodapé que contém uma soma de verificação ADLER32.
  • gzdeflate () usa o DEFLATE crua algoritmo em si, que é a base tanto para um dos outros formatos.

Todos os três usam o mesmo algoritmo sob o capô. gzencode() acrescenta a capacidade de incluir o nome do arquivo original e outros dados ambientais (isto não é utilizada quando apenas comprimir uma string). gzencode() e gzcompress() tanto adicionar uma soma de verificação, de modo a integridade do arquivo pode ser verificado, o que pode ser útil sobre os métodos de transmissão e armazenamento não-confiáveis. Se tudo é armazenado localmente e você não precisa de nenhum metadados adicionais, em seguida, gzdeflate() seria suficiente. Para portabilidade eu recomendo gzencode() (formato GZIP) que é provavelmente melhor do que apoiado gzcompress() (formato ZLIB), entre outras ferramentas.

Quando se comprime cadeias muito curtas a sobrecarga de cada método torna-se relevante uma vez que para a entrada de muito curto a sobrecarga pode compreender uma parte significativa da produção. A sobrecarga para cada método, medido através da compressão de uma cadeia vazia, é:

  • gzencode('') = 20 bytes
  • gzcompress('') = 8 bytes
  • gzdeflate('') = 2 bytes

Outras dicas

Não sou especialista PHP e não pode responder à pergunta colocada, mas parece que há um monte de adivinhar acontecendo aqui, e informações difusa sendo oferecida.

DEFLATE é o nome do algoritmo de compressão que é utilizado por ZLIB, GZIP e outros. Em teoria, GZIP suporta algoritmos de compressão alternativos, mas na prática, não há nenhum.

Não existe tal coisa como "o algoritmo GZIP". GZIP utiliza o algoritmo deflacionar, e coloca o enquadramento de dados em torno dos dados comprimidos. Com GZIP você pode adicionar coisas como o nome do arquivo, o tempo do arquivo, a CRC, mesmo um comentário. Este metadados é opcional, porém, e muitos gzippers apenas omiti-lo.

ZLIB é semelhante, excepto com um conjunto diferente, mais limitado de metadados, e um cabeçalho específico de 2 bytes.

Esta é tudo em IETF RFCs 1950 , 1951 , e 1952 .

Para dizer que "o gzip algoritmo compressas melhor do que DEFLATE" é apenas um disparate. Não há algoritmo gzip. E o algoritmo usado no formato GZIP é DEFLATE .

Todos os métodos são essencialmente os mesmos, a diferença entre eles é principalmente nos cabeçalhos. pessoalmente eu usaria gzencode, isso irá produzir uma saída que é igual a uma invocação de linha de comando para o utilitário gzip.

Eu tive que descompactar um arquivo compactado gzip em PHP com C ++. Descobri que a gzencode PHP e o seu homólogo gzdecode usar o método Z_NO_FLUSH e no final do bloco de dados para codificação / descodificação, aplica Z_FINISH. O exemplo / tutorial em C mostrado no site do zlib pode ser usado para descomprimir e arquivos compressa gziped do PHP, enquanto os bits do Windows e do nível de memória é alterada para permitir deflations gzip e inflações.

Extra:. Parece a maioria das pessoas neste segmento não tem idéia o "Método de compressão" significava

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top