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.
Настройка во время выполнения
Поведение этих функций зависит от установок в php.ini.
Модуль zlib предоставляет возможность сжатия передаваемых страниц (в т.ч. динамических) на лету, если браузер это поддерживает. За сжатие отвечают три параметра в конфигурационном файле php.ini.
| Имя | По умолчанию | Меняемо | Список изменений |
|---|---|---|---|
| zlib.output_compression | "0" | PHP_INI_ALL | Доступно с PHP 4.0.5. |
| zlib.output_compression_level | "-1" | PHP_INI_ALL | Доступно с PHP 4.3.0. |
| zlib.output_handler | "" | PHP_INI_ALL | Доступно с PHP 4.3.0. |
Краткое разъяснение конфигурационных директив.
-
zlib.output_compressionboolean/integer -
Следует ли сжимать страницы. Если значение равно "On" в php.ini (или в настройках Apache), страницы будут сжиматься, если браузер посылает заголовок "Accept-Encoding: gzip" или "deflate". При этом в вывод будут добавлены заголовки "Content-Encoding: gzip" (соответственно "deflate") и "Vary: Accept-Encoding". В режиме исполнения, заголовок должен быть установлен до момента отправки.
Аргументы также могут быть целочисленного типа, а не логического "On/Off", с помощью этого вы можете устанавливать размер выходного буфера (по умолчанию равен 4 КБ).
Замечание:
output_handler должен быть пустым, если выбрано значение 'On'! Вместо него следует использовать zlib.output_handler.
-
zlib.output_compression_levelinteger -
Уровень сжатия используется для прозрачного сжатия вывода. Укажите значение между 0 (без сжатия) и 9 (максимальное сжатие). По умолчанию значение -1 позволяет серверу решать, какой уровень использовать.
-
zlib.output_handlerstring -
Если zlib.output_compression активирован, нельзя указывать дополнительные обработчики вывода (output handlers). Этот параметр выполняет то же, что и output_handler, но в ином порядке.
Apparently, there is a bug in certain versions of PHP with setting zlib.output_compression to "On" via ini_set:
<?php
ini_set("zlib.output_compression", "On");
?>
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:
<?php
ini_set("zlib.output_compression", 4096);
?>
