你试图用gzdeflate()
的输出做的事情是行不通的.您不能删除末尾的字节以try 连接.您can只需连接由PHPgzencode()
生成的GZIP流(不删除任何内容),然后这些流就是有效的GZIP数据.虽然我被告知gzdecode()
有一个错误,不会解码这样的gzip成员序列.(应该有人报告这个漏洞.)
你可以使用deflate_init()
和deflate_add()
,加上适当的冲洗选项,来建立一个兼容的、完整的放气水流.对于每个单独的流,您可以使用ZLIB_SYNC_FLUSH
,后跟ZLIB_FINISH
来创建一个以空的、存储的Eflate块结束的Eflate流,该块以字节边界结束,然后是一个标记为最后一个块的空固定块.最后一个空的固定块是两个字节.如果从结尾处删除它,则可以在它之后串联另一个放气流.连接的最后一个这样的片段应该not删除最后两个字节,从而整个事物是适当终止的放空流.
在try 时,我发现了另一个错误.如果数据字符串为空,则deflate_add()
将不接受ZLIB_SYNC_FLUSH
请求.你可以整天重复拨打deflate_add($def, '', ZLIB_SYNC_FLUSH);
,但它不会起任何作用.您需要使用ZLIB_SYNC_FLUSH
在您的最后一个呼叫的deflate_add()
,with的一些数据.例如:
$def = deflate_init(ZLIB_ENCODING_RAW);
$out = deflate_add($def, 'this ', ZLIB_NO_FLUSH);
$out = deflate_add($def, 'is ', ZLIB_NO_FLUSH);
$out .= deflate_add($def, 'a test.', ZLIB_SYNC_FLUSH);
$out .= deflate_add($def, '', ZLIB_FINISH);
(出于某种原因,我每次回答有关PHP的问题时都会发现更多的错误.我想知道为什么人们会用它.)
由OP编辑:以下是我们真正需要的内容:
// first file
$def1 = deflate_init(ZLIB_ENCODING_RAW);
$file1 = deflate_add($def1, "1111111111", ZLIB_SYNC_FLUSH);
// second file, compress in two part
$def2 = deflate_init(ZLIB_ENCODING_RAW);
$file2 = deflate_add($def2, "22222", ZLIB_NO_FLUSH);
$file2 .= deflate_add($def2, "33333", ZLIB_SYNC_FLUSH);
// join on the fly
// $def3 = deflate_init(ZLIB_ENCODING_RAW);
// $joined = $file1 . $file2;
// $joined .= deflate_add($def3, "", ZLIB_FINISH);
// or simply :
$joined = $file1 . $file2 . "\03\00";
// decompress
$decompress = gzinflate($joined);