不使用exec()如何在PHP中解压tar.gz文件?

29

如何在不使用exec('tar')或任何其他命令的情况下,使用纯PHP解压缩tar.gz文件?

我的问题如下:我有一个26MB的tar.gz文件需要上传到我的服务器并进行解压缩。我尝试使用net2ftp进行解压缩,但它不支持上传后的tar.gz解压缩。

我正在使用免费的Web主机,因此他们不允许任何exec()命令,并且不允许访问提示符。那么我该如何解压缩这个文件呢?

PHP是否有内置命令可以使用?

2个回答

55
自从PHP 5.3.0版本起,您不需要使用Archive_Tar。现在有一个新类可以处理tar归档文件:PharData类。 使用PharData::extractTo()方法(与ZipArchive::extractTo()类似)进行解压缩:
try {
    $phar = new PharData('myphar.tar');
    $phar->extractTo('/full/path'); // extract all files
} catch (Exception $e) {
    // handle errors
}

如果你有一个tar.gz档案,那么在提取之前先解压它(使用PharData::decompress()函数):

// decompress from gz
$p = new PharData('/path/to/my.tar.gz');
$p->decompress(); // creates /path/to/my.tar

// unarchive from the tar
$phar = new PharData('/path/to/my.tar');
$phar->extractTo('/full/path');

1
由于某种原因,PharData :: extractTo 在 Windows 上的 PHP 5.4.0 中无法正常工作。无法弄清楚原因。 - TinyGrasshopper
我看到了你的问题,但是很抱歉我没有安装5.4.0版本的Windows来测试它。 - j0k
与文档相反,它似乎不接受目录作为第二个参数。 - Daniel Saner
此外,PharData在某些类型的tar内容上失败。http://stackoverflow.com/questions/37189687/phardata-class-fails-when-tar-contents-has-relative-paths - artfulrobot
对于仍然遇到此错误的任何人,请将其转换为zip文件,然后再进行提取。在此处查看解决方案:https://dev59.com/eZnga4cB1Zd3GeqPb6zo - Kevin Florenz Daus
非常酷。我在自定义的 Moodle 备份/恢复脚本中使用了它。他们从 .zip 切换到 .tar,但将备份伪装成 .mbz。只需更改几行代码,它就完美地工作了。谢谢! - Andy

3

PEAR提供了Archive_Tar,该类支持Gzip和BZ2压缩,前提是分别加载了zlib和bz2扩展。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接