PHP GZip и потоки событий, отправленные сервером

Я пишу поток отправленных сервером событий в PHP и получаю сообщение об ошибке:

«не удалось сбросить сжатие вывода буфера zlib»

Я считаю, что это связано с попыткой сбросить сжатый вывод.

Вот мой PHP-код:

header ("Content-Type: text/event-stream\n\n");
header ("Cache-Control: no-cache");

echo "data: {$json}";
echo "\n\n";

ob_flush(); // ERROR HERE
flush();

Мой вопрос в том, как лучше всего заставить это работать - в идеале, не отключая gzip в apache - можно ли его отключить в PHP?

Я пробовал это, но это не сработало:

if(ini_get('zlib.output_compression')){
    ini_set('zlib.output_compression', 'Off');
}

person benedict_w    schedule 17.09.2012    source источник


Ответы (1)


Вы не можете использовать сжатие вывода zlib вместе с обработчиком вывода ob_. См. документы php на zlib.output_compression, он указывает это несколько раз.

Если выяснилось, что самый простой способ включить сжатие вывода в php — просто сделать это:

ini_set("zlib.output_compression", 1);
ini_set("zlib.output_compression_level", 9);

И потерять все ob_* вещи. Теперь, когда клиент запрашивает страницу с заголовком, например:

Accept-Encoding: gzip, deflate

zlib сжимает ваше тело ответа для вас И устанавливает это для вас в ответе:

Content-Encoding: gzip

Я потратил часы своей жизни на это, прежде чем понял, насколько это просто с этими двумя строками. и не используйте флеш вообще неявно

person Glenn Plas    schedule 03.10.2012