[英]How do you create a .gz file using PHP?
I would like to gzip compress a file on my server using PHP.我想使用 PHP 对我的服务器上的文件进行 gzip 压缩。 Does anyone have an example that would input a file and output a compressed file?
有没有人有一个例子可以输入一个文件并输出一个压缩文件?
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);
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.
下面的函数在大文件上应该更可靠,因为它以 512kb 的块读取和写入文件。
/**
* 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;
}
Also, you could use php's wrappers , the compression ones .此外,您可以使用 php 的包装器,即压缩器。 With a minimal change in the code you would be able to switch between gzip, bzip2 or zip.
只需对代码进行最小的更改,您就可以在 gzip、bzip2 或 zip 之间切换。
$input = "test.txt";
$output = $input.".gz";
file_put_contents("compress.zlib://$output", file_get_contents($input));
change compress.zlib://
to
(see comment to this answer about zip compression) , or to compress.zip://
for zip compression
compress.bzip2://
to bzip2 compression.将
compress.zlib://
更改为
(请参阅此关于 zip 压缩的答案的评论) ,或将compress.zip://
以进行 zip 压缩
compress.bzip2://
更改为 bzip2 压缩。
带有gzencode() 的简单单行:
gzencode(file_get_contents($file_name));
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
、 system
、 shell_exec
),您可以使用它们来简单地gzip
文件。
exec("gzip ".$filename);
NB: Be sure to properly sanitize the $filename
variable before using it, especially if it comes from user input (but not only).注意:在使用
$filename
变量之前一定要正确清理它,特别是如果它来自用户输入(但不仅如此)。 It may be used to run arbitrary commands, for example by containing something like my-file.txt && anothercommand
(or my-file.txt; anothercommand
).它可用于运行任意命令,例如通过包含类似
my-file.txt && anothercommand
(或my-file.txt; anothercommand
)的内容。
如果您只想解压缩文件,这可以工作并且不会导致内存问题:
$bytes = file_put_contents($destination, gzopen($gzip_path, r));
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.
我摆脱了所有嵌套的 if/else 语句,从而降低了圈复杂度,通过异常更好地处理错误,而不是跟踪布尔错误状态,某些类型提示,如果文件具有 gz 扩展名,我将退出已经。 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;
}
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;
}
copy('file.txt', 'compress.zlib://' . 'file.txt.gz'); copy('file.txt', 'compress.zlib://' .'file.txt.gz'); See documentation
查看文档
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.