使用PHP创建bzip2归档数据非常容易,这要归功于其在bzcompress中的实现。在我的当前应用程序中,我不能仅仅将输入文件读入字符串,然后调用
我怀疑我对此的理解存在一些漏洞,或者我的代码似乎可以正确地逐步压缩仅仅是偶然的。
我非常感谢在这里得到一些解释。
bzcompress
或bzwrite
。 PHP文档并没有清楚地说明使用相对较小的数据连续调用bzwrite
是否会产生与一次性压缩整个文件相同的结果。我的意思是类似于:$data = file_get_contents('/path/to/bigfile');
$cdata = bzcompress($data);
我尝试使用下面展示的例程进行分段bzcompression。
function makeBZFile($infile,$outfile)
{
$fp = fopen($infile,'r');
$bz = bzopen($outfile,'w');
while (!feof($fp))
{
$bytes = fread($fp,10240);
bzwrite($bz,$bytes);
}
bzclose($bz);
fclose($fp);
}
function unmakeBZFile($infile,$outfile)
{
$bz = bzopen($infile,'r');
while (!feof($bz))
{
$str = bzread($bz,10240);
file_put_contents($outfile,$str,FILE_APPEND);
}
}
set_time_limit(1200);
makeBZFile('/tmp/test.rnd','/tmp/test.bz');
unmakeBZFile('/tmp/test.bz','/tmp/btest.rnd');
为了测试这段代码,我做了两件事情:
- 我使用了
makeBZFile
和unmakeBZFile
来压缩和解压缩一个SQLite数据库 - 这正是我最终需要做的。 - 我创建了一个50MB大小,填充了随机数据的文件
dd if=/dev/urandom of='/tmp.test.rnd bs=50M count=1
在两种情况下,我执行了diff original.file decompressed.file
,发现两者完全相同。
这很好,但我不清楚为什么它能工作。PHP文档说明bzread(bzpointer,length)
读取最多length
字节的未压缩数据。如果我的代码如下所示,则可以工作,因为我将bzwite
和bzread
的大小强制设置为10240字节。
lenth
字节数。我查看了bzip2文件格式,但我没有发现任何有助于为.bz文件块建立未压缩数据长度的信息。我怀疑我对此的理解存在一些漏洞,或者我的代码似乎可以正确地逐步压缩仅仅是偶然的。
我非常感谢在这里得到一些解释。
bzwrite
如何逐块写入数据。但是,对于bzread
如何读取指定数量的未压缩字节,我还不太清楚。考虑到每个块中的数据压缩程度会有所不同,这并不像想象中那么简单,即“他想要X个字节的未压缩数据,所以让我只获取下一个X/未压缩大小的块”。 - DroidOS