2013-06-19 2 views
1

Я нашел несколько статей в Интернете, которые предлагают использовать функции ob_, все эти преимущества подчеркивания, и нет недостатков в использовании упомянутых функций.Буферизация вывода? Почему нет?

Мой вопрос в том, каковы недостатки использования ob_ функций или установки ini_set('output_buffering', '1');?

+2

Объем памяти в основном. –

+0

Также, каковы ваши источники? –

+1

Из документов: 'Некоторые веб-серверы (например, Apache) изменяют рабочий каталог скрипта при вызове функции обратного вызова. Вы можете изменить его, например. chdir (dirname ($ _ SERVER ['SCRIPT_FILENAME'])) в функции обратного вызова. ' –

ответ

1

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

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

Рассмотрим следующий пример:

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

Вот 2 фрагменты, которые демонстрируют то, что я имею в виду, которые вы можете попробовать для себя

# 1

<?php 
    echo 1/0; 
?> 

выходов

Warning: Division by zero on line 1 

# 2

<?php 
    ob_start(); 
    echo 1/0; 
    $var = ob_get_clean(); 
?> 

выходы ничего.

Чтобы избежать подобных случаев, вам необходимо проявлять осмотрительность в отношении проверки ошибок и принять меры предосторожности.

При использовании старательно, ob_ * функции очень мощные и супер полезные.

+0

Ошибки должны обрабатываться отдельно в любом случае с помощью 'set_error_handler()'. –

-1

Вот довольно хорошо использовать для ob_ функций:

ob_start("ob_gzhandler");

При условии, что расширение Zlib включена в PHP, который должен обеспечить ваш выход GZ-сжато. Это заметно ускоряет перенос страниц для больших страниц.

+2

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

0

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

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

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

0

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

Если вы выдаете данные непосредственно клиенту, у вас нет этой проблемы. Это особенно важно в таких случаях и при передаче файлов. В случае создания «нормальной» HTML-страницы вы, скорее всего, не будете использовать весь буфер, хотя вам все еще нужна большая память, если у вас много одновременных запросов.

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

Смежные вопросы