Pregunta

Tengo una gran cantidad de datos para mover usando dos scripts PHP: uno en el lado del cliente usando un script PHP de línea de comandos y otro detrás de Apache. PUBLICO los datos en el lado del servidor y uso php: // flujo de entrada para guardarlos en el servidor web. Para evitar que se alcance cualquier límite de memoria, los datos se separan en fragmentos de 500 kB para cada solicitud POST. Todo esto funciona bien.

Ahora, para guardar el ancho de banda y acelerarlo, quiero comprimir los datos antes de enviarlos y descomprimirlos cuando los reciba en el otro extremo. Encontré 3 pares de funciones que pueden hacer el trabajo, pero no puedo decidir cuál usar:

¿Qué par de funciones recomendarías y por qué?

ACTUALIZACIÓN: Acabo de leer las preguntas frecuentes de zlib:

El formato gzip ( gzencode ) fue diseñado para retener la información del directorio sobre un solo archivo, como el nombre y la última fecha de modificación. El formato zlib ( gzcompress ), por otro lado, fue diseñado para aplicaciones en canal de memoria y comunicación, y tiene un encabezado y un trailer mucho más compactos y utiliza una verificación de integridad más rápida que gzip.

¿Fue útil?

Solución

Todos estos pueden ser utilizados. Hay diferencias sutiles entre los tres:

  • gzencode () usa el archivo GZIP formato, lo mismo que la herramienta de línea de comando gzip . Este formato de archivo tiene un encabezado que contiene metadatos opcionales, DEFLATE datos comprimidos y un pie de página que contiene una suma de verificación CRC32 y verificación de longitud.
  • gzcompress () usa el formato ZLIB . Tiene un encabezado más corto que sirve solo para identificar el formato de compresión, DEFLATE datos comprimidos y un pie de página que contiene una suma de verificación ADLER32.
  • gzdeflate () usa el DEFLATE sin procesar algoritmo por sí solo, que es la base para los otros dos formatos.

Los tres usan el mismo algoritmo bajo el capó. gzencode () agrega la capacidad de incluir el nombre del archivo original y otros datos ambientales (esto no se usa cuando solo se comprime una cadena). gzencode () y gzcompress () ambos agregan una suma de verificación, por lo que la integridad del archivo puede ser verificada, lo que puede ser útil sobre métodos de almacenamiento y transmisión poco confiables. Si todo se almacena localmente y no necesita metadatos adicionales, entonces gzdeflate () sería suficiente. Para la portabilidad, recomendaría gzencode () (formato GZIP), que probablemente sea mejor compatible que gzcompress () (formato ZLIB) entre otras herramientas.

Al comprimir cadenas muy cortas, la sobrecarga de cada método se vuelve relevante ya que para una entrada muy corta, la sobrecarga puede comprender una parte significativa de la salida. La sobrecarga para cada método, medida al comprimir una cadena vacía, es:

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

Otros consejos

No soy un experto en PHP y no puedo responder a la pregunta planteada, pero parece que hay muchas suposiciones aquí, y se ofrece información borrosa.

DEFLATE es el nombre del algoritmo de compresión que usan ZLIB, GZIP y otros. En teoría, GZIP admite algoritmos de compresión alternativos, pero en la práctica, no hay ninguno.

No existe tal cosa como "el algoritmo GZIP". GZIP usa el algoritmo DEFLATE y coloca datos de trama alrededor de los datos comprimidos. Con GZIP puede agregar cosas como el nombre del archivo, la hora del archivo, un CRC, incluso un comentario. Sin embargo, estos metadatos son opcionales y muchos gzippers simplemente lo omiten.

ZLIB es similar, excepto con un conjunto de metadatos diferente, más limitado, y un encabezado específico de 2 bytes.

Todo esto está en RFC IETF 1950 , 1951 , y 1952 .

Para decir que " el algoritmo gzip se comprime mejor que DEFLATE " Es una tontería. No hay algoritmo gzip. Y el algoritmo utilizado en el formato GZIP es DEFLATE .

Todos los métodos son esencialmente iguales, la diferencia entre ellos está principalmente en los encabezados. personalmente utilizaría gzencode, esto producirá un resultado que es igual a una invocación de línea de comandos para la utilidad gzip.

Tuve que descomprimir un archivo comprimido gzip en PHP con C ++. Descubrí que PHP gzencode y su contraparte gzdecode usan el método Z_NO_FLUSH y al final del bloque de datos para codificar / descodificar , aplica Z_FINISH . El ejemplo / tutorial en C que se muestra en el sitio web de zlib se puede usar para descomprimir y comprimir archivos gziped desde PHP, siempre que se modifique el bit de windows y el nivel de memoria para permitir las deflaciones e inflaciones de gzip.

Extra: Parece que la mayoría de las personas en este hilo no tienen idea de qué " Método de compresión " significaba.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top