我正在处理的项目需要创建.tar.gz归档文件并将其传输到外部服务中。这个外部服务只接受.tar.gz格式的文件,因此其他类型的文件不行。执行代码的服务器不允许访问系统调用,因此system、exec、backticks等都不行。这意味着我必须依靠纯PHP实现来创建.tar.gz文件。
经过一些研究,似乎PharData对于实现这个目标很有帮助。然而,我在使用它时遇到了困难,需要一些指导。
考虑以下文件夹布局:
我使用以下代码片段创建.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
从目录中的文件构建tar/zip归档。
虽然buildFromDirectory
的描述中并没有包含父文件夹在归档中是可以理解的,但我也尝试过使用buildFromIterator
,但最终结果也是一样的,即归档中不包含父文件夹。我能够使用addFile
获得所需的结果,但这个方法非常缓慢。
经过进一步研究,我找到了以下库:https://github.com/alchemy-fr/Zippy。但这需要composer
支持,而服务器上没有此功能。如果有人能指导我实现最终结果将不胜感激。我也愿意使用其他方法或库,只要它是纯PHP实现且不需要任何外部依赖项。不确定是否有帮助,但执行代码的服务器具有PHP 5.6。