2012-01-18 56 views
0

我有一个大型的xml文件内存数组作为字符串。将内存中的PHP数组压缩为.tar.gz文件(PHAR?)

我正在寻找从PHP(5.3)创建可读/可提取.tar.gz文件的最有效方法。

当前我使用的是this class

但是:

  • 它看起来并不保持
  • 它要求文件(所以我创造数以千计的文件从我的记忆阵列是无用的几毫秒后)

所以我正在寻找一种处理.tar.gz文件的有效方法,最重要的一点是能够使用一个简单的命令轻松地将文件放入其中:

$ myArchive-> putFi leFromString($ fileName,$ dataString);

看起来像是可以配置PHAR与TAR & GZ,所以它可能是一个解决方案?

$p = $p->convertToExecutable(Phar::TAR, Phar::GZ); 

奖金的问题,我不知道这是否会更好地建设它生活(每个XML字符串后一代)以节省内存,或只是等待这个庞大的对象&敷一次。在这种情况下,proc_usage/mem_usage的比例不清楚。

目标最大使用量是100K XML文件。

谢谢!

+2

为什么不使用[zlib的(http://php.net/manual/en/book.zlib.php)和如果你需要某些功能,将它包装在一个类中? – afuzzyllama 2012-01-18 15:39:51

+0

我对这个问题不是很清楚。你想将所有的xml文件保存到一个tar.gz文件中,但是也可以添加新的文件?你能举一些例子吗? – Rannnn 2012-01-19 11:08:48

+0

@afuzzyllama:zlib用于.gz文件,它只压缩一个文件。您需要首先查找所有单个文件,然后才能在其上使用zlib。 – cweiske 2012-02-20 11:54:46

回答

0

如果您想创建tgz文件,请使用PEAR的Archive_Tar包。它可以让你从内存中动态创建的tar + GZ文件:

require_once 'Archive/Tar.php'; 
$t = new Archive_Tar('/path/to/dest.tar.gz', 'gz'); 
foreach ($xmlfiles as $key => $content) { 
    $t->addString($key . '.xml', $content); 
} 
2

这是一个有点晚了,但以供将来参考:

可以使用从该PharData类创建tar.gz压缩phar扩展。这是一个有点像ZipArchive,但您可以使用阵列接口添加内容:

$archive = new PharData("outfile.tar"); 
foreach ($xmlfiles as $name => $data) { 
    $archive[$name] = $data; 
} 

// compress to "outfile.tar.gz 
$gzipped = $archive->compress(Phar::GZ); 

// delete outfile.tar 
unset($archive); 
unlink("outfile.tar"); 
+0

但是为了使这个工作'phar.readonly'必须在php.ini文件中设置为0(off)。您会发现许多主机将此值设置为1,无法禁用它,从而无法使用phar来压缩文件。 – jahu 2015-01-26 09:47:51