我正在从事的项目需要创建.tar.gz档案并将其提供给外部服务。该外部服务仅适用于.tar.gz,因此毫无疑问要使用其他类型的存档。我正在处理代码的服务器将无法执行系统调用。因此system
,,exec
反引号等不是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
确实提到了以下内容,因此可以理解它在存档中不包含父文件夹:
根据目录中的文件构造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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句