使用具有100,000多个条目的PHP编写.tgz文件,但避免单个文件写入

时间:2015-03-30 11:43:23

标签: php gzip tar phar

我正在尝试编写一个.tgz文件,其中包含数十个(如果不是数十万个)文件条目,每个文件的内容都来自数据库中的字符串。每个文件条目大约有2-5k的数据。

我想避免这样做而不必先写出文件。目前我有PHP创建一个传统的目录结构,编写文件,然后使用shellexec从最后创建一个tgz。

我们使用的磁盘速度很慢,因此写入数万个文件需要很长时间。即使在使用tmpfs ramdisk和大量CPU的快速磁盘的另一台机器上运行原型,我每秒获得大约100-200个文件条目的速率,这感觉很慢 - 对于目录结构中的150,000个文件,半小时。一旦编写完成,从本机操作系统目录结构到tgz的实际转换就没有问题了。

我希望用PharData来写作。但是,PharData :: addFromString似乎在添加文件后立即执行文件写入,而不是Open-> Add-> Writeout模式。

有人可以建议任何策略吗?

然后可以下载最终的tgz文件,并且不会经常刷新。但是因为要创建一系列这些文件,只需等待30-60分钟就可以打包它就会变成一个阻塞者。

2 个答案:

答案 0 :(得分:0)

您可以直接使用php gzopen / gzwrite / gzclose函数,并格式化您自己的tar标头,然后输入条目数据。 php gzwrite documentation page上有一个例子。

答案 1 :(得分:0)

这是个老问题,不过我会尽力回答。
至少 PHP 5.3 支持 Phar 缓冲:

<块引用>

Phar::startBuffering()
开始缓冲 Phar 写操作,不要修改磁盘上的 Phar 对象

<块引用>

Phar::stopBuffering()
停止缓冲对 Phar 存档的写入请求,并将更改保存到磁盘


一个关于它看起来如何的小例子:

<?php
$phar = new Phar('bundle.phar');
$phar->startBuffering();
// ... adding files and contents ...
$phar->setStub('<?php __HALT_COMPILER();');
$phar->stopBuffering();