微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用PHP创建.tar.gz文件

我正在开展的项目需要创建.tar.gz档案并将其提供给外部服务.此外部服务仅适用于.tar.gz,因此另一种类型的存档是不可能的.我正在处理的代码将执行的服务器不允许访问系统调用.所以系统,执行,反击等都不是bueno.这意味着我必须依靠纯PHP实现来创建.tar.gz文件.

做了一些研究后,似乎PharData将有助于实现结果.然而,我已经碰壁了,需要一些指导.

请考虑以下文件夹布局:

parent folder
  - child folder 1
  - child folder 2
  - file1
  - file2

我使用下面的代码片段来创建.tar.gz存档,它可以解决这个问题,但最终结果存在一个小问题,它不包含父文件夹,而是包含其中的所有内容.

$pd = new PharData('archive.tar');

$dir = realpath("parent-folder");

$pd->buildFromDirectory($dir);

$pd->compress(Phar::GZ);

unset( $pd );

unlink('archive.tar');

创建存档时,它必须包含上面提到的确切文件夹布局.使用上面提到的代码片段,存档包含除父文件夹之外的所有内容,该文件夹是外部服务的交易破解者:

- child folder 1
- child folder 2
- file1
- file2

buildFromDirectory的描述确实提到了以下内容,因此它不包含存档中的父文件夹是可以理解的:

Construct a tar/zip archive from the files within a directory.

我也尝试过使用buildFromIterator,但最终结果也是一样的,即父文件夹不包含在存档中.我能够使用addFile获得所需的结果,但这很慢.

做了一些研究后,我发现了以下库:https://github.com/alchemy-fr/Zippy.但这需要在服务器上不可用的作曲家支持.如果有人可以指导我实现最终结果,我将不胜感激.我也愿意使用其他一些方法或库,只要它的纯PHP实现并且不需要任何外部依赖.不确定它是否有帮助,但代码将被执行的服务器有PHP 5.6

解决方法:

使用“parent-folder”的父级作为Phar::buildFromDirectory()的基础,并使用其第二个参数将结果限制为“父文件夹”,例如:

$parent = dirname("parent-folder");
$pd->buildFromDirectory($parent, '#^'.preg_quote("$parent/parent-folder/", "#").'#');
$pd->compress(Phar::GZ);

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐