使用PHP编写一个.tgz文件,文件大小为100000+;条目,但避免单个文件写入

使用PHP编写一个.tgz文件,文件大小为100000+;条目,但避免单个文件写入,php,gzip,tar,phar,Php,Gzip,Tar,Phar,我正在尝试编写一个.tgz文件,其中包含数十个甚至数十万个文件条目,每个条目的内容都来自数据库中的字符串。每个文件条目大约有2-5k的数据 我想避免这样做而不必先写出文件。目前,我让PHP创建一个传统的目录结构,编写文件,然后在最后使用shellexec从中生成tgz 我们正在使用的磁盘速度很慢,因此写入数以万计的文件需要很长时间。即使在另一台使用tmpfs ramdisk和大量CPU的高速磁盘的机器上运行原型,我每秒也会收到大约100-200个文件条目,这感觉很慢——对于目录结构中的15000

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

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

我们正在使用的磁盘速度很慢,因此写入数以万计的文件需要很长时间。即使在另一台使用tmpfs ramdisk和大量CPU的高速磁盘的机器上运行原型,我每秒也会收到大约100-200个文件条目,这感觉很慢——对于目录结构中的150000个文件来说,半小时。一旦编写完成,从本机OS目录结构到tgz的实际转换就没有问题了

我希望用这些数据来写作。但是,PharData::addFromString似乎在添加文件后立即执行文件写入,而不是打开->添加->写出模式

有人能提出一些策略吗


最终的tgz文件将可供下载,并且不会经常刷新。但是,由于要创建一系列这样的文件,只需等待30-60多分钟就可以打包,这是一个相当大的障碍。

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

这是一个老问题,但我将尝试回答它。
PHP5.3至少支持Phar缓冲:


开始缓冲Phar写入操作,不要修改磁盘上的Phar对象


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


下面是一个小例子,说明这将是什么样子:

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

您能否提供一些您想要的性能改进的背景信息,以及该文件的用途?需要多长时间刷新一次文件?例如,如果这是一个可在网站上下载的文件,您是否需要每半小时更新一次?(我同意每秒200个条目听起来很慢,但我认为压缩是一个CPU密集型的过程)。如果您不担心输出文件的大小变大,请尝试降低压缩级别。
gzip
命令确实有一个
--fast
选项,试试看?当您禁用压缩以确定性能问题所在时,比较工作负载肯定会很有趣。我怀疑你最大的胜利将来自于使用不同的结构来保存数据-因此改变的范围是什么?我已经补充了一些澄清-问题不在于压缩阶段,而是压缩之前的当前目录创建阶段,但我希望有更好的方法从根本上解决这个问题。我还澄清了该文件的使用-见新的最后一段。遗憾的是,这似乎也有同样的问题-它在每次调用addString后写出整个归档,而不是允许多个addString完成后再写入该文件。因此,除了100000+次压缩计算之外,这还需要100000+次文件写入,因此比目录结构方法更糟糕。