Compresión de ficheros con PHP a GZIP

 
Para crear un fichero con el formato GZIP en PHP, podemos usar las funciones del módulo ZLIB. Las principales funciones de compresión son:

gzencode (sTexto, iNivelCompresion, iTipoCompresion)
gzcompress (sTexto, iNivelCompresion)
gzdeflate (sTexto, iNivelCompresion)

Donde:
sTextoEl texto a comprimir
iNivelCompresion(Opcional) Entero con un valor entre -1 y 9 para gzdeflate y gzencode y entre 0 y 9 para gzcompress. Siendo 0 el nivel de compresión mas bajo (sin reducción de tamaño) y 9 la compresión mas alta. A mas compresión mas coste de procesador / tiempo. El valor -1 haría una compresión por defecto, por lo general igual que 8
iTipoCompresion(Opcional) Sólo con gzencode, fuerza el formato de compresión a realizar, puede recibir dos valores: FORCE_GZIP (1), valor por defecto, que comprime en formato GZIP y FORCE_DEFLATE que comprime en formato deflate.


Las tres funciones devuelven una cadena comprimida, la diferencia entre ellas es que gzencode la devuelve en "formato fichero", es decir la devuelve con cabeceras. Esto hace que si volcamos la salida a un fichero, lo podamos abrir con un programa gzip. Mientras que las otras dos sólo devuelven la cadena comprimida, gzcompress en formato gzip y gzdecode en formato decode, la ventaja de estas es que al no incluir cabeceras, los ficheros son un poco mas pequeños, y la desventaja es si queremos descomprimir estos ficheros con una aplicación fuera de PHP, esta nos devolverá error.

Con esto nosotros hemos decidido utilizar en el ejemplo de este artículo la función gzencode, ya que con ella podremos utilizar los ficheros resultantes comprimidos tanto en el entorno PHP, como descargándolos y descomprimiéndolos donde queramos.

Sin embargo si sólo quisiéramos utilizar estos ficheros para trabajar con PHP y estuviéramos seguros de nunca necesitarlos en otros entornos, podríamos utilizar las otras funciones, que sería reemplazando en el ejemplo la línea:

$sDesGZ = gzencode($sOriBin, $iNivelComp);

Para gzcompress:

$sDesGZ = gzcompress($sOriBin, $iNivelComp);

Para gzdeflate:

$sDesGZ = gzdeflate($sOriBin, $iNivelComp);

El ejemplo como vemos es una función muy sencilla que recibe dos valores, la dirección del fichero a comprimir y el nivel de compresión que por defecto si no se pasa será 8 y se basa en los siguientes pasos:
1 - Abre el fichero origen
2 - Comprime sus datos
3 - Crea un fichero nuevo .gz con los datos comprimidos en el mismo directorio que el fichero origen

Tener en cuenta que para poder crear el fichero comprimido en el servidor, el usuario debe tener permisos de escritura en la carpeta donde se vaya a dejar este.


Código:
<?php
    //Copyright © McAnam.com  

    function iComprimir($sFichOrigen, $iNivelComp = 8){
        
        $sFichDetino = $sFichOrigen.".gz";
        
        if ( ! $fOrigen = @fopen($sFichOrigen, "rb"))
            return false;
        $sOriBin = fread($fOrigen, filesize($sFichOrigen));
        fclose($fOrigen);
        
        $sDesGZ = gzencode($sOriBin, $iNivelComp);

        if ( ! $fDestino = @fopen ($sFichDetino, "wb"))
            return false;
        fwrite($fDestino, $sDesGZ);
        fclose($fDestino);

        return true;
        
    }
    
    // Ejemplo:
    if (iComprimir ("directorio_fichero/archivo_origen.xxx", 9))
    {
        echo "Fichero comprimido satisfactoriamente !!!";
    }else{
        echo "Se ha producido un error en la compresión del fichero.<br>";
        echo "Asegúrese de que la ruta del fichero a comprimir es valida y tiene permisos de escritura";
    }


    

?>

Links relacionados:
Descompresión de ficheros de tipo GZIP con PHP
Cambiar tamaño y peso de imágenes
Recorrer directorio para tratar su contenido
Forzar descarga de ficheros en lado cliente
Formulario HTML para enviar archivos al servidor
Imprimir archivo directamente desde el servidor en impresora de red


Para cualquier duda, consulta, sugerencia, opinión, colaboración, etc; no dude en ponerse en contacto con nosotros

Copyright © 2002-2017 [McAnam]. Reservados todos los derechos.
www.mcanam.com