Является ли использование буферизации вывода плохой практикой?

Считаются ли ob_start/ob_get_clean() плохой практикой программистов php в целом?

Есть ли недостатки буферизации вывода?


person Alex    schedule 19.01.2011    source источник


Ответы (8)


На самом деле это хорошая практика. Ускорить передачу данных

person kos    schedule 19.01.2011
comment
Как именно это делается? Как этот ответ на самом деле помогает мне? - person Tim Post♦; 03.07.2011
comment
Он может иметь в виду очистку выходного буфера сразу после тега </head>. См. developer.yahoo.com/performance/rules.html. - person Ian Dunn; 22.03.2012

Буферизация вывода в некоторых случаях почти обязательна. С PHP, как только вы что-то возвращаете пользователю, отправляются заголовки. Поэтому, если вы частично обработаете страницу и произойдет что-то, требующее отправки заголовка, вы не сможете, если не включена буферизация. В противном случае вы получите ужасную ошибку «Невозможно изменить информацию заголовка — заголовки уже отправлены».

Некоторые скажут вам, что вы не должны кодировать таким образом. фигня говорю!

С включенными буферами ваш код может быть более гибким.

person DeveloperChris    schedule 19.01.2011

буферизация вывода НЕ является плохой практикой. Например, он может ускорить загрузку вашего веб-сайта. используя сжатие GZIP (хотя, если возможно, лучше сделать это внутри .htaccess).

<?php 
    if (substr_count($_SERVER['HTTP_ACCEPT_ENCODING'], 'gzip')) 
        ob_start("ob_gzhandler"); 
    else 
        ob_start(); 
?>

Недостатки: не знаю. Хороший вопрос.

PS: также я нашел эту тему о буферизации вывода.

person Alfred    schedule 19.01.2011
comment
на самом деле для некоторых браузеров лучше отправлять header('Content-Length: '.ob_get_length()); после отправки текста, иначе они могут неправильно его декодировать. Для каких-то древних браузеров, но есть еще проц. - person kos; 19.01.2011
comment
Я думаю, вы могли бы быть правы. Спасибо за информацию :) - person Alfred; 19.01.2011

Для эффективности программы захват выходного буфера неплох. Это полезная функция PHP. Однако его можно использовать для вещей, которые лучше делать другими методами. Запах кода может быть проблемой, поэтому убедитесь, что нет лучшего и более ясного решения вашей проблемы.

person Jonah    schedule 19.01.2011
comment
Проблемы с реализацией, которые вызывают другие (иногда более серьезные) проблемы. В этом случае использование неправильного решения для решения проблемы. Подробнее здесь: codinghorror.com/blog/2006/05/code-smells .html - person Jonah; 19.01.2011

Это не считается плохим (или хорошим). Кому-то это нравится, кому-то нет. Лично я думаю, что есть причины не использовать его. Я думаю об этом как о последнем средстве. Иногда у вас может возникнуть ситуация, когда буферизация вывода может быть вашим единственным выбором для решения конкретной проблемы, поэтому сохраните эту опцию только для таких ситуаций.

Я не думаю, что при его использовании есть какой-либо прирост производительности или ускорение загрузки страницы, но это также зависит от того, какой сервер вы используете, и используете ли вы php как mod_php или как cgi или fastcgi.

person Dmitri    schedule 19.01.2011

Основной недостаток буферизации вывода заключается в том, что вы не знаете (или обращаете внимание), насколько глубок ваш стек буферов. Объедините это с чрезмерно агрессивной обработкой ошибок или подпрограммами, которые неожиданно завершаются/умирают, и вы потеряете все, что находится в буфере, оставив мало подсказок относительно того, что происходит.

Например, инфраструктура Zend использует буферизацию вывода почти для всего, но когда она сталкивается с критической ошибкой, она печатает сообщение и немедленно завершает работу. Любая полезная отладочная информация будет потеряна.

person Roger Halliburton    schedule 19.01.2011

Если я не ошибаюсь, у Java также есть эта буферизация ввода и вывода для чтения и записи файла.

person Nazrul Muhaimin    schedule 19.01.2011

Конечно, буферизация вывода означает, что содержимое, которое могло быть немедленно отправлено в браузер, теперь остается на сервере, что занимает дополнительную память (очень важная проблема, если вы имеете дело с высокой масштабируемостью), поэтому, если ваша программа затем принимает какое-то время для выполнения эти накладные расходы памяти ухудшили бы производительность.

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

person Tim Lind    schedule 17.05.2011