ob_get_level() начинается с уровня 1

Возникли некоторые проблемы с буферизацией вывода. В основном я пытаюсь запустить буферизацию вывода с обратным вызовом ob_gzhandler, но он продолжает говорить мне, что использует неподдерживаемый тип сжатия. Все включено, и я считаю, что проблема в том, что запуск ob_get_level() в начале моего скрипта дает уровень 1. В php.ini мой output_buffering установлен на 4096.

Если я запускаю что-то вроде:

while(ob_get_level() > 0){
   ob_end_clean();
}

Затем я могу успешно запустить ob_start() с обратным вызовом ob_gzhandler. Но мне интересно, должно ли это быть проблемой. Во время моего скрипта я делаю вызовы ob_clean() в разных точках, поскольку я избегаю слишком большого количества буферов, поскольку я читал, что это может повысить производительность. Я просто не знаю, что мне здесь делать.

Ваше здоровье.


person Jason Lewis    schedule 04.09.2010    source источник


Ответы (1)


У вас включена буферизация вывода по умолчанию (см. документацию) - это в основном означает, что каждый PHP-скрипт начинается с ob_start().

Если вы хотите отключить OB по умолчанию для всех скриптов PHP, в вашем php.ini установите output_buffering = Off.

Если вы хотите отключить OB по умолчанию только для этого конкретного скрипта, используйте цикл while - это вполне правильно.

Что касается ob_clean - вы уверены, что хотите удалить вывод, который находится в вашем буфере? ИМО, в этом нет необходимости, если только вы не видите значительных медленных загрузок страниц. Не беспокойтесь об оптимизации (по крайней мере, сейчас).

person Piskvor left the building    schedule 04.09.2010
comment
Да, я верю, что знаю. Он установлен как: output_buffering = 4096 (о чем я сказал выше). Что я имею в виду, должен ли я оставить все как есть и просто запустить цикл, который у меня есть выше, чтобы я мог начать буферизацию вывода ob_gzhandler? - person Jason Lewis; 04.09.2010
comment
@ Джейсон Льюис: решать вам. Я бы, вероятно, оставил OB по умолчанию для всех скриптов и завершал бы его циклом while в тех случаях, когда я хотел бы использовать свой собственный. - person Piskvor left the building; 04.09.2010
comment
Я хотел сказать, что использую ob_get_clean() в нескольких местах, чтобы сохранить вывод в нескольких переменных, и в конечном итоге он сбрасывается. Это хороший способ сделать это, или я должен создать новый буфер для каждого места, где я хочу захватить вывод, и вместо этого использовать ob_get_flush()? - person Jason Lewis; 04.09.2010
comment
На самом деле это не работает, когда я запускаю ob_start('ob_gzhandler'), а затем использую ob_clean(). Кажется, отображается неподдерживаемый тип сжатия. Итак, я использую мастер-буфер (ob_start()), затем записываю необходимые выходные данные в своем приложении и после этого очищаю буфер. Затем, когда дело доходит до отображения окончательного вывода, я завершаю основной буфер и запускаю новый буфер со сжатием, и, похоже, он работает. - person Jason Lewis; 04.09.2010