2009-03-07 10 views
51

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 comando y otro detrás de Apache. YO PUBLICO los datos al lado del servidor y uso la secuencia de entrada php: // para guardarlo en el extremo del servidor web. Para evitar que se alcancen los límites de memoria, los datos se separan en fragmentos de 500 kB para cada solicitud POST. Todo esto funciona bien¿Qué método de compresión usar en PHP?

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. He encontrado 3 pares de funciones que pueden hacer el trabajo, pero no puedo decidir cuál usar:

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

ACTUALIZACIÓN: acabo de leer FAQ zlib:

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

+1

'gzdecode()' no parece estar disponible en php todavía, así que evítelo. –

+1

'gzdecode()' está definido solo para PHP 5.4.0 o posterior: http://php.net/manual/en/function.gzdecode.php –

Respuesta

62

Todos estos se pueden utilizar. Hay diferencias sutiles entre los tres:

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

Los tres usan el mismo algoritmo debajo del capó. gzencode() agrega la capacidad de incluir el nombre del archivo original y otros datos ambientales (esto no se usa cuando se comprime una cadena). gzencode() y gzcompress() ambos agregan una suma de comprobación, por lo que se puede verificar la integridad del archivo comprimido, lo que puede ser útil sobre métodos de transmisión y almacenamiento no confiables. Si todo está almacenado localmente y no necesita ningún metadato adicional, será suficiente con gzdeflate(). Para la portabilidad, recomendaría gzencode() (formato GZIP), que probablemente esté mejor soportado que gzcompress() (formato ZLIB), entre otras herramientas.

+3

Casi correcto. Investigué un poco, y parece que gzencode no contiene datos de encabezado, solo tiene diferentes datos de encabezado. –

+2

@Milan Supongo que querías decir "gzcompress no está sin datos de encabezado, simplemente tiene diferentes datos de encabezado". – thomasrutter

4

Todos los métodos son esencialmente iguales, la diferencia entre ellos se encuentra principalmente en los encabezados. Personalmente, usaría gzencode, esto producirá un resultado que es igual a una invocación de línea de comando a la utilidad gzip.

39

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

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

No existe el "algoritmo GZIP". GZIP usa el algoritmo DEFLATE y coloca datos de encuadre alrededor de los datos comprimidos. Con GZIP puede agregar cosas como el nombre de 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 diferente y más limitado de metadatos y un encabezado específico de 2 bytes.

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

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.

+0

Gracias por aclarar esto. Hasta la lectura, nada más tenía sentido ... – rvighne