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

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

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

8 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам