Search code examples
phpoutput-buffering

PHP output buffer issue when using ob_gzhandler and ob_clean together


I'm having a hard time figuring out the problem in the following code, I really need a solution to this.

Consider the following code :

<?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;

This code fails to output "Hi", instead I see "‹óÈM", what have done that broke correct buffering? Knowing that once I remove "ob_gzhandler", the buffering is correct and everything is fine. I don't want to create another buffer and destroy the current one. I just want to clean the current one using ob_clean.

Any ideas? Thanks in advance.


Solution

  • Thank you for your answer, I figured out why, GZIP is insalled on my machine by the way, it's that when setting ob_gzhandler, the buffer is compressed chunk by chunk, so when using ob_get_contents(), parts of the last chunck are missing, and I end up getting weird output.

    To correct that behaviour (or at least to bypass it), open a second output buffer, and leave the one with gzhandler() alone.

    Like this

    ob_start("ob_gzhandler");
    ob_start();
    

    Now the second one isn't compressed, I can do whatever I want with it (hence get its content, clean it etc). The content will be compressed anyway given that a higher level output buffer with gzhandler is opened.