In the hopes this will help others - a hard to spot gotcha when implementing zlib.output_compression. if you use flush() anywhere in your script (even right at the end) the compression won't work - you need to let that happen automatically or it ends up being sent uncompressed.
The behaviour of these functions is affected by settings in php.ini.
The zlib extension offers the option to transparently compress your pages on-the-fly, if the requesting browser supports this. Therefore there are three options in the configuration file php.ini.
|zlib.output_compression||"0"||PHP_INI_ALL||Available since PHP 4.0.5.|
|zlib.output_compression_level||"-1"||PHP_INI_ALL||Available since PHP 4.3.0.|
|zlib.output_handler||""||PHP_INI_ALL||Available since PHP 4.3.0.|
Here's a short explanation of the configuration directives.
Whether to transparently compress pages. If this option is set to "On" in php.ini or the Apache configuration, pages are compressed if the browser sends an "Accept-Encoding: gzip" or "deflate" header. "Content-Encoding: gzip" (respectively "deflate") and "Vary: Accept-Encoding" headers are added to the output. In runtime, it can be set only before sending any output.
This option also accepts integer values instead of boolean "On"/"Off", using this you can set the output buffer size (default is 4KB).
output_handler must be empty if this is set 'On' ! Instead you must use zlib.output_handler.
Compression level used for transparent output compression. Specify a value between 0 (no compression) to 9 (most compression). The default value, -1, lets the server decide which level to use.
You cannot specify additional output handlers if zlib.output_compression is activated here. This setting does the same as output_handler but in a different order.
Apparently, there is a bug in certain versions of PHP with setting zlib.output_compression to "On" via ini_set:
In some cases, it does not send the Content-type header and browsers won't know to decompress the contents before displaying. Instead, you can set it to the buffer size, which sends the correct header: