Search code examples
phpcompressiongzip

How do you create a .gz file using PHP?


I would like to gzip compress a file on my server using PHP. Does anyone have an example that would input a file and output a compressed file?


Solution

  • The other answers here load the entire file into memory during compression, which will cause 'out of memory' errors on large files. The function below should be more reliable on large files as it reads and writes files in 512kb chunks.

    /**
     * GZIPs a file on disk (appending .gz to the name)
     *
     * From http://stackoverflow.com/questions/6073397/how-do-you-create-a-gz-file-using-php
     * Based on function by Kioob at:
     * http://www.php.net/manual/en/function.gzwrite.php#34955
     * 
     * @param string $source Path to file that should be compressed
     * @param integer $level GZIP compression level (default: 9)
     * @return string New filename (with .gz appended) if success, or false if operation fails
     */
    function gzCompressFile($source, $level = 9){ 
        $dest = $source . '.gz'; 
        $mode = 'wb' . $level; 
        $error = false; 
        if ($fp_out = gzopen($dest, $mode)) { 
            if ($fp_in = fopen($source,'rb')) { 
                while (!feof($fp_in)) 
                    gzwrite($fp_out, fread($fp_in, 1024 * 512)); 
                fclose($fp_in); 
            } else {
                $error = true; 
            }
            gzclose($fp_out); 
        } else {
            $error = true; 
        }
        if ($error)
            return false; 
        else
            return $dest; 
    } 
    

    UPDATE: Gerben has posted an improved version of this function that is cleaner and uses exceptions instead of returning false on an error. See https://stackoverflow.com/a/56140427/195835