【问题标题】:Compress in-memory PHP array to a .tar.gz file (PHAR?)将内存中的 PHP 数组压缩为 .tar.gz 文件(PHAR?)
【发布时间】:2012-02-13 08:01:36
【问题描述】:

我有一个大的内存数组作为字符串的 xml 文件。

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

目前我正在使用this class

但是:

  • 看起来没有维护
  • 它需要文件(所以我从我的内存阵列中创建了数千个文件,这些文件在几毫秒后就没用了)

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

$myArchive->putFileFromString($fileName, $dataString);

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

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

额外的问题,我不确定是否最好实时构建它(在每个 xml 字符串生成之后)以节省内存,或者只是等待这个巨大的对象并压缩一次。在这种情况下,我不清楚 proc_usage / mem_usage 的比率。

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

谢谢!

【问题讨论】:

  • 如果您需要某些功能,为什么不使用Zlib 并将其包装在一个类中?
  • 我对这个问题不是很清楚。你想把所有的 xml 文件保存到一个 tar.gz 中,还可以添加新文件到里面吗?你能举几个例子吗?
  • @afuzzyllama:zlib 用于 .gz 文件,它只压缩一个文件。在使用 zlib 之前,您需要先压缩所有单个文件。

标签: php compression gzip phar


【解决方案1】:

有点晚了,但供以后参考:

您可以使用 phar 扩展中的 PharData 类创建 tar.gz 存档。它有点像 ZipArchive,只是你可以使用 Array 接口添加内容:

$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");

【讨论】:

  • 然而,为了使 phar.readonly 工作,必须在 php.ini 文件中将其设置为 0(关闭)。您会发现许多主机将此值设置为 1 且无法禁用它,从而导致无法使用 phar 压缩文件。
【解决方案2】:

如果要创建 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);
}

【讨论】:

    猜你喜欢
    • 2011-10-30
    • 2018-06-26
    • 2016-12-26
    • 2016-07-12
    • 2013-04-27
    • 2011-11-01
    • 1970-01-01
    • 2013-04-29
    • 2020-11-27
    相关资源
    最近更新 更多