一起使用ob_gzhandler和ob_clean时的PHP输出缓冲区问题

时间:2013-12-24 12:18:32

标签: php output-buffering

我很难在以下代码中找出问题,我真的需要一个解决方案。

请考虑以下代码:

<?php
//starting a new output buffer, with a GZIP compression
ob_start("ob_gzhandler");
//this goes into the buffer
echo "Hi";
//grabbing the buffer's content
$content = ob_get_contents();
//cleaning the buffer
ob_clean();
//we're still inside the buffer, show the content again
echo $content;

此代码无法输出“Hi”,相反,我看到“<óÈM”,这样做了什么打破了正确的缓冲?知道一旦我删除“ob_gzhandler”,缓冲是正确的,一切都很好。我不想创建另一个缓冲区并销毁当前缓冲区。我只想用ob_clean清理当前的那个。

有什么想法吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

感谢您的回答,我弄清楚为什么,GZIP在我的机器上被安装了,在设置ob_gzhandler时,缓冲区是按块进行压缩的,所以当使用ob_get_contents()时,部件最后一个chunck丢失了,我最终得到了奇怪的输出。

要纠正这种行为(或者至少绕过它),打开第二个输出缓冲区,然后单独使用gzhandler()。

喜欢这个

ob_start("ob_gzhandler");
ob_start();

现在第二个没有被压缩,我可以随心所欲地做任何事情(因此得到它的内容,清理它等)。考虑到打开gzhandler的更高级别的输出缓冲区,内容将被压缩。

答案 1 :(得分:0)

也许您没有在计算机上启用/安装gzip压缩。

尝试了你的代码,得到了类似的东西。我没有在我的机器上安装gzip,试试这个: 这是你的代码但有条件,如果gzip没有启动,缓冲区就会启动。

//starting a new output buffer, with a GZIP compression
if (!ob_start("ob_gzhandler")) ob_start();
//this goes into the buffer
echo "Hi";
//grabbing the buffer's content
$content = ob_get_contents();
//cleaning the buffer
ob_clean();
//we're still inside the buffer, show the content again
echo "<pre>"; echo $content; echo "</pre>";
ob_end_flush(); 

如果你得到“嗨”,可能没有安装gzip。