我正在从事的项目需要创建 .tar.gz 档案并将其提供给外部服务。此外部服务仅适用于 .tar.gz,因此另一种类型的存档是不可能的。我正在处理的代码将执行的服务器不允许访问系统调用。所以system,,,exec反引号等都不是好东西。这意味着我必须依赖纯 PHP 实现来创建 .tar.gz 文件。
做了一些研究后,似乎这PharData将有助于实现结果。然而我遇到了困难,需要一些指导。
考虑以下文件夹布局:
parent folder
- child folder 1
- child folder 2
- file1
- file2
Run Code Online (Sandbox Code Playgroud)
我使用下面的代码片段创建 .tar.gz 存档,该存档可以解决问题,但最终结果有一个小问题,它不包含父文件夹,但包含其中的所有内容。
$pd = new PharData('archive.tar');
$dir = realpath("parent-folder");
$pd->buildFromDirectory($dir);
$pd->compress(Phar::GZ);
unset( $pd );
unlink('archive.tar');
Run Code Online (Sandbox Code Playgroud)
创建存档时,它必须包含上述确切的文件夹布局。使用上面提到的代码片段,存档包含除父文件夹之外的所有内容,父文件夹是外部服务的破坏者:
- child folder 1
- child folder 2
- file1
- file2
Run Code Online (Sandbox Code Playgroud)
的描述buildFromDirectory确实提到了以下内容,因此它不包含存档中的父文件夹是可以理解的:
从目录中的文件构建 tar/zip 存档。
我也尝试过使用buildFromIterator,但最终结果也相同,即父文件夹不包含在存档中。我能够使用 获得所需的结果,addFile但这非常慢。
做了更多研究后,我发现了以下库: https: //github.com/alchemy-fr/Zippy。但这需要composer服务器上不可用的支持。如果有人可以指导我实现最终结果,我将不胜感激。我也愿意使用其他一些方法或库,只要它是纯 PHP 实现并且不需要任何外部依赖项。不确定它是否有帮助,但执行代码的服务器有 PHP 5.6
使用“parent-folder”的父级作为基础,Phar::buildFromDirectory()并使用其第二个参数将结果限制为仅“parent-folder”,例如:
$parent = dirname("parent-folder");
$pd->buildFromDirectory($parent, '#^'.preg_quote("$parent/parent-folder/", "#").'#');
$pd->compress(Phar::GZ);
Run Code Online (Sandbox Code Playgroud)