How do you create a .gz file using PHP?

PhpCompressionGzip

Php Problem Overview


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?

Php Solutions


Solution 1 - Php

This code does the trick

// Name of the file we're compressing
$file = "test.txt";

// Name of the gz file we're creating
$gzfile = "test.gz";

// Open the gz file (w9 is the highest compression)
$fp = gzopen ($gzfile, 'w9');

// Compress the file
gzwrite ($fp, file_get_contents($file));

// Close the gz file and we're done
gzclose($fp);

Solution 2 - Php

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; 
} 

Solution 3 - Php

Also, you could use php's wrappers, the compression ones. With a minimal change in the code you would be able to switch between gzip, bzip2 or zip.

$input = "test.txt";
$output = $input.".gz";

file_put_contents("compress.zlib://$output", file_get_contents($input));

change compress.zlib:// to compress.zip:// for zip compression (see comment to this answer about zip compression), or to compress.bzip2:// to bzip2 compression.

Solution 4 - Php

Simple one liner with gzencode():

gzencode(file_get_contents($file_name));

Solution 5 - Php

It's probably obvious to many, but if any of the program execution functions is enabled on your system (exec, system, shell_exec), you can use them to simply gzip the file.

exec("gzip ".$filename);

N.B.: Be sure to properly sanitize the $filename variable before using it, especially if it comes from user input (but not only). It may be used to run arbitrary commands, for example by containing something like my-file.txt && anothercommand (or my-file.txt; anothercommand).

Solution 6 - Php

If you are looking to just unzip a file, this works and doesn't cause issues with memory:

$bytes = file_put_contents($destination, gzopen($gzip_path, r));

Solution 7 - Php

Here's an improved version. I got rid of all the nested if/else statements, resulting in lower cyclomatic complexity, there's better error handling through exceptions instead of keeping track of a boolean error state, some type hinting and I'm bailing out if the file has a gz extension already. It got a little longer in terms of lines of code, but it's much more readable.

/**
 * Compress a file using gzip
 *
 * Rewritten from Simon East's version here:
 * https://stackoverflow.com/a/22754032/3499843
 *
 * @param string $inFilename Input filename
 * @param int    $level      Compression level (default: 9)
 *
 * @throws Exception if the input or output file can not be opened
 *
 * @return string Output filename
 */
function gzcompressfile(string $inFilename, int $level = 9): string
{
    // Is the file gzipped already?
    $extension = pathinfo($inFilename, PATHINFO_EXTENSION);
    if ($extension == "gz") {
        return $inFilename;
    }

    // Open input file
    $inFile = fopen($inFilename, "rb");
    if ($inFile === false) {
        throw new \Exception("Unable to open input file: $inFilename");
    }

    // Open output file
    $gzFilename = $inFilename.".gz";
    $mode = "wb".$level;
    $gzFile = gzopen($gzFilename, $mode);
    if ($gzFile === false) {
        fclose($inFile);
        throw new \Exception("Unable to open output file: $gzFilename");
    }

    // Stream copy
    $length = 512 * 1024; // 512 kB
    while (!feof($inFile)) {
        gzwrite($gzFile, fread($inFile, $length));
    }

    // Close files
    fclose($inFile);
    gzclose($gzFile);

    // Return the new filename
    return $gzFilename;
}

Solution 8 - Php

Compress folder for anyone needs

function gzCompressFile($source, $level = 9)
{
    $tarFile = $source . '.tar';

    if (is_dir($source)) {
        $tar = new PharData($tarFile);
        $files = scandir($source);
        foreach ($files as $file) {
            if (is_file($source . '/' . $file)) {
                $tar->addFile($source . '/' . $file, $file);
            }
        }
    }

    $dest = $tarFile . '.gz';
    $mode = 'wb' . $level;
    $error = false;
    if ($fp_out = gzopen($dest, $mode)) {
        if ($fp_in = fopen($tarFile, 'rb')) {
            while (!feof($fp_in))
                gzwrite($fp_out, fread($fp_in, 1024 * 512));
            fclose($fp_in);
        } else {
            $error = true;
        }
        gzclose($fp_out);
        unlink($tarFile);
    } else {
        $error = true;
    }
    if ($error)
        return false;
    else
        return $dest;
}

Solution 9 - Php

copy('file.txt', 'compress.zlib://' . 'file.txt.gz'); See documentation

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAlBeebeView Question on Stackoverflow
Solution 1 - PhpAlBeebeView Answer on Stackoverflow
Solution 2 - PhpSimon EastView Answer on Stackoverflow
Solution 3 - PhpCarlos CampderrósView Answer on Stackoverflow
Solution 4 - PhpdtbarneView Answer on Stackoverflow
Solution 5 - PhpsylbruView Answer on Stackoverflow
Solution 6 - PhpFrank CareyView Answer on Stackoverflow
Solution 7 - PhpGerbenView Answer on Stackoverflow
Solution 8 - PhpĐàmView Answer on Stackoverflow
Solution 9 - PhpAnatoliy MelnikovView Answer on Stackoverflow