2010-06-18 1 views
1

Я могу видеть использование ob_start с набором параметров output_callback, но я не вижу использования ob_start при вызове его без каких-либо параметров.Какой смысл использовать ob_start без каких-либо параметров в PHP

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

ob_start(); 
for ($i = 1; $i <= 15; $i++) 
{ 
    echo $i, ' '; 
    sleep(1); 
} 
ob_end_flush(); 

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

ответ

4

Одна из причин заключается в том, чтобы «захватить» выход небольшой части кода.

Итак, предположим, что у вас есть независимый фрагмент кода, который вы хотите выполнить, но вы не хотите просто выводить его напрямую. Что вы можете сделать, это

ob_start(); 
include 'file.php'; 
$output = ob_get_clean(); 

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

ob_start(); 
phpinfo(); 
$info = ob_get_clean(); 
//Massage the output, remove the doctype, html, head, and body tags 
echo $info; 

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

2

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

(примечание: это в докладе только из блогов разработчиков ядра PHP, я не проверял это сам, так что я не конкретные цифры для сколько быстрее это.)

Да, он хранит буфер в памяти, но насколько большой ваш выход HTML? Вероятно, довольно мало по сравнению с пределом памяти вашей среды PHP.

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

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

0
  1. убедившись, что вы не получите ошибку «заголовки уже прислал»
  2. поймать всех HTML данных для создания файла кэша

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

1

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

Прочтите эту статью о буферизации буфера, чтобы получить больше идей о том, как ее использовать. http://www.devshed.com/c/a/PHP/Output-Buffering-With-PHP/