Какой смысл использовать ob_start без каких-либо параметров в PHP - PullRequest
1 голос
/ 18 июня 2010

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

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

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

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

Ответы [ 4 ]

4 голосов
/ 18 июня 2010

Одной из причин является "захват" вывода небольшого фрагмента кода.

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

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 голосов
/ 18 июня 2010

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

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

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

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

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

1 голос
/ 18 июня 2010

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

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

0 голосов
/ 18 июня 2010
  1. убедившись, что вы не получите ошибку 'заголовки уже отправлены'
  2. перехватите все html-данные для создания файла кэша

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

...