Question

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.

Was it helpful?

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.

OTHER TIPS

Maybe you don't have gzip compression enabled/installed on your machine.

Tried your code and got something like that. I don't have gzip installed on my machine, try this: It's your code but with a condition, if gzip doesn't start, the buffer starts.

//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(); 

If you get "Hi", maybe gzip is not installed.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top