我正在尝试编写一个.tgz文件,其中包含数十个(如果不是数十万个)文件条目,每个文件的内容都来自数据库中的字符串。每个文件条目大约有2-5k的数据。
我想避免这样做而不必先写出文件。目前我有PHP创建一个传统的目录结构,编写文件,然后使用shellexec从最后创建一个tgz。
我们使用的磁盘速度很慢,因此写入数万个文件需要很长时间。即使在使用tmpfs ramdisk和大量CPU的快速磁盘的另一台机器上运行原型,我每秒获得大约100-200个文件条目的速率,这感觉很慢 - 对于目录结构中的150,000个文件,半小时。一旦编写完成,从本机操作系统目录结构到tgz的实际转换就没有问题了。
我希望用PharData来写作。但是,PharData :: addFromString似乎在添加文件后立即执行文件写入,而不是Open-> Add-> Writeout模式。
有人可以建议任何策略吗?
然后可以下载最终的tgz文件,并且不会经常刷新。但是因为要创建一系列这些文件,只需等待30-60分钟就可以打包它就会变成一个阻塞者。
答案 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();