ob_start
Эта функция включает буферизацию вывода. Если буферизация вывода активна, вывод скрипта не высылается (кроме заголовков), а сохраняется во внутреннем буфере.
Содержимое этого внутреннего буфера может быть скопировано в строковую переменную, используя ob_get_contents() . Для вывода содержимого внутреннего буфера следует использовать ob_end_flush() . В качестве альтернативы можно использовать ob_end_clean() для уничтожения содержимого буфера.
Некоторые web-сервера (например Apache) изменяют рабочую директорию скрипта, когда вызывается callback-функция. Вы можете вернуть ее назад, используя chdir(dirname($_SERVER['SCRIPT_FILENAME'])) в callback-функции.
Буферы вывода помещаются в стек, то есть допускается вызов ob_start() после вызова другой активной ob_start() . При этом необходимо вызывать ob_end_flush() соответствующее количество раз. Если активны несколько callback-функций, вывод последовательно фильтруется для каждой из них в порядке вложения.
Список параметров
Можно задать необязательный параметр output_callback . Эта функция принимает строку в виде аргумента и должна также вернуть строку. Она вызывается при сбросе (отправке) или очистке (с помощью ob_flush() , ob_clean() или подобных функций) или если буфер вывода сбрасывается в браузер по окончанию запроса. При вызове функции output_callback , она получает содержимое буфера и должна вернуть обновленное содержимое для буфера вывода, который будет отправлен браузеру. Если output_callback не является допустимой функцией, то документируемая функция вернет FALSE . Описание функции для этого параметра:
Если output_callback вернет FALSE , то оригинальная информация отправится в браузер без изменений.
Параметр output_callback может быть игнорирован передачей значения NULL .
ob_end_clean() , ob_end_flush() , ob_clean() , ob_flush() и ob_start() не могут вызываться из callback-функций, так как их поведение непредсказуемо. Если вы хотите удалить содержимое буфера, то верните "" (пустую строку) из callback-функции. Вы так же не можете вызывать функции print_r($expression, true) или highlight_file($filename, true) из callback-функций буферизации вывода.
Замечание:
В PHP 4.0.4 функция ob_gzhandler() была введена для облегчения отправки gz-кодированных данных web-браузерам, поддерживающим сжатые web-страницы. ob_gzhandler() определяет тип кодировки содержимого, принимаемый браузером, и возвращает вывод соответствующим образом.
Если передан не обязательный параметр chunk_size , то буфер буден сброшен после любого вывода превышающего или равного по размеру chunk_size . Значение по умолчанию 0 означает, что функция вывода будет вызвана, когда буфер будет закрыт.
До PHP 5.4.0, значение 1 было специальным значением, которое устанавливало параметр chunk_size в 4096.
Параметр flags является битовой маской, которая управляет операциями, которые можно совершать над буфером вывода. По умолчанию она позволяет буферу вывода быть очищенным, сброшенным и удаленным, что равносильно значению PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE , или PHP_OUTPUT_HANDLER_STDFLAGS как сокращение этой комбинации.
Each flag controls access to a set of functions, as described below:
| Константа | Функции |
|---|---|
| PHP_OUTPUT_HANDLER_CLEANABLE | ob_clean() , ob_end_clean() , и ob_get_clean() . |
| PHP_OUTPUT_HANDLER_FLUSHABLE | ob_end_flush() , ob_flush() , и ob_get_flush() . |
| PHP_OUTPUT_HANDLER_REMOVABLE | ob_end_clean() , ob_end_flush() , и ob_get_flush() . |
Возвращаемые значения
Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки.
Список изменений
| Версия | Описание |
|---|---|
| 7.0.0 | В случае, если ob_start() используется внутри callback-функции буфера вывода, эта функция больше не будет приводить к ошибке E_ERROR , а вместо этого будет вызывать E_RECOVERABLE_ERROR , позволяя сторонним обработчикам ошибок поймать ее. |
| 5.4.0 | Третий параметр ob_start() изменен с булева ( boolean ) параметра erase (который при установке в FALSE предотвращал удаление буфера до тех пор, пока не завершалась работа скрипта) на целочисленный ( integer ) параметр flags . К сожалению, это означает появление несовместимости API для кода, который использовал третий параметр до версии PHP 5.4.0. Смотрите пример с флагами, чтобы понять как работать с кодом, чтобы он поддерживал совместимость с обеими версиями. |
| 5.4.0 | Параметр chunk_size, установленный в 1, теперь приводит к выводу по 1 байту в выходной буфер. |
| 4.3.2 | Функция вернет FALSE в случае, если output_callback не сможет быть выполнена. |
Примеры
Пример #1 Пример callback-функции, определенной пользователем
function callback ( $buffer )
<
// заменить все яблоки апельсинами
return ( str_replace ( «яблоки» , «апельсины» , $buffer ));
>
Что такое буферизация вывода PHP?

Буферизация вывода — одна из тех концепций в PHP, с которой достаточно часто сталкиваются разработчики, но обычно никто даже не задумывается, как она устроена. Мы перевели текст What is PHP Output Buffering? разработчика Лары Шенк, в котором она детально объясняет эту концепцию.
tl; dr : Буферизация вывода в PHP — способ указать, что нужно отдельно сохранить данные перед их отправкой в браузер. Эти данные в последствии можно получить, а затем поместить в переменную, работать с ними и, уже позже, отправить в браузер.
Разве эта концепция вообще важна?
Как человек, регулярно работающий с WordPress, я могу сказать, что буферизация вывода — одна из тех концепций, с которой я постоянно сталкиваюсь, но не задумываюсь, как она работает. Вообще, буферизация хороший пример обучения на основе принципа «необходимо знать» — например, при использовании плагинов или фреймворков мы постоянно встречаемся с кодом, про который вообще ничего не знаем — как он работает и даже для чего нужен. Мы просто знаем, как его использовать — и делаем это. Однако иногда все-таки нужно понять, что это за код и зачем он вообще нужен.
В эту кроличью нору с буферизацией в PHP я попал из-за вопроса, который мне пришел на почту про плагин Timber — я люблю использовать его при разработке сайтов на WordPress. У меня спросили: «Что делают header.php и footer.php в плагине Timber?». Быстрый ответ на этот вопрос: «Они ничего не делают», потому что они нужны для работы определенных плагинов в WordPress — однако я этого не знал, потому что мне никогда не приходилось сталкиваться со взаимодействием с этими файлами во время разработки. Мне стало интересно, и я начал исследовать, из чего состоят эти файлы. Оказалось, что в основном в них находятся функции буферизации вывода PHP ( ob_start, ob_get_contents). В этой статье мы не будем подробно разбирать устройство Timber, но поговорим про буферизацию вывода в PHP.
Что такое буферизация вывода?
Давайте представим диалог разработчика с языком программирования PHP (если бы с ним можно было просто поговорить):
Вы: «Эй, PHP! Не нужно отправлять сразу же в браузер кое-какой вывод, как ты делаешь это обычно. Сначала я хочу кое-что написать, и уже потом подам знак, когда этот вывод можно будет отправить».
PHP: «Хорошо, я сохраню его в буфере, пока ты не скажешь мне, когда отправлять его в браузер».
Вы: «Спасибо, PHP! Не волнуйся, ты по-прежнему актуален, и другие языки тебя не заменят!».
Другими словами, PHP отправляет данные в браузер с сервера, как только функция завершается. Например, если вы пишете код: echo "Hi there"; для получения строки «Привет!», она отправляется браузеру сразу после запуска функции с echo. Однако, если вы запустите функцию echo, когда действует буферизация вывода, сообщение «Привет» будет сохранено в этой невидимой удерживающей ячейке, которая и называется буфером. И она не будет отображаться на странице, пока вы не получите ее содержимое и не отправите его в браузер.
Функции
Существует несколько основных функций для работы буферизации вывода:
ob_start() запускает буферизацию вывода. Другими словами, она создает буфер (невидимую ячейку), в которой будет храниться весь вывод после ее вызова.
ob_get_contents() собирает все данные, которые находятся в буфере после выполнения команды ob_start. Обычно с помощью этой функции данные из буфера присваивают переменной.
ob_clean() удаляет все из буфера. Обратите внимание, что она ничего не выводит — просто очищает буфер.
ob_flush() выводит содержимое из буфера. Обратите внимание, что она не очищает буфер.
ob_end_clean() очищает буфер и отключает буферизацию вывода.
ob_end_flush() выводит содержимое из буфера и завершает буферизацию вывода. Буфер не стирается.
Самое важное в использовании функций буферизации вывода — это то, где вы их размещаете . Вам нужно запустить буфер с помощью ob_start в нужном месте, и вывести буфер либо на страницу, либо в переменную, прежде чем вы его очистите.
Зачем мне использовать буферизацию?
Вполне возможно, что вы никогда не будете использовать буферизацию вывода, особенно если вы не являетесь разработчиком плагинов WordPress, или не пишете собственные приложения PHP. Для тех, кто не делает ни того, ни другого, я дам несколько примеров, когда эта концепция может пригодиться:
Заголовки HTTP
Вы когда-нибудь видели такую ошибку?
Warning: Cannot modify header information — headers already sent by (output started at /some/file.php:12) in /some/file.php on line 23
Для тех, кто не знаком с определением HTTP-заголовка — это информация, отправляемая с сервера по HTTP-запросу. Она сообщает браузеру, какие данные передаются, прежде чем попадут к нему. HTTP-заголовки содержат данные про тип содержимого, дату его последнего изменения, тип отправившего запрос сервера и многое другое. Загвоздка в том, что HTTP-заголовки необходимо отправлять до того, как с сервера будут отправлены какие-либо выходные данные.
Быстрый пример: предположим, ваше приложение сохраняет данные для входа пользователя в файлы cookie — в специальный тип HTTP-заголовка. Эти данные должны отправляться в браузер раньше любых других данных сайта или приложения. При этом, в зависимости от того, как устроена ваша программа, код cookie не обязан находиться в самом начале файла. И тут как раз вступает в действие буферизация вывода, которая позволяет сказать: «Привет PHP, я скажу, когда нужно отправить вывод сайта после того, как обработаются cookie-файлы». В ином случае вы просто столкнетесь с ошибкой, про которую я писал чуть выше.
Обратите внимание, что появление этой ошибки может указывать и на использование плохих практик написания кода с точки зрения структуры вашего приложения. Например, такая ошибка может выпадать из-за конфликтов с другими плагинами.
Вывод
Если вы фронтенд-разработчик, то, скорее всего, вы никогда не сталкивались с буферизацией вывода и вам кажется, что эта статья не очень полезна для вас. Но придет день, когда рано или поздно вам придется понять эти базовые истины — и вы вернетесь к этому материалу.
What's the use of ob_start() in php?
Is ob_start() used for output buffering so that the headers are buffered and not sent to the browser? Am I making sense here? If not then why should we use ob_start() ?
9 Answers 9
Think of ob_start() as saying «Start remembering everything that would normally be outputted, but don’t quite do anything with it yet.»
There are two other functions you typically pair it with: ob_get_contents() , which basically gives you whatever has been «saved» to the buffer since it was turned on with ob_start() , and then ob_end_clean() or ob_flush() , which either stops saving things and discards whatever was saved, or stops saving and outputs it all at once, respectively.
I use this so I can break out of PHP with a lot of HTML but not render it. It saves me from storing it as a string which disables IDE color-coding.
![]()
The accepted answer here describes what ob_start() does — not why it is used (which was the question asked).
As stated elsewhere ob_start() creates a buffer which output is written to.
But nobody has mentioned that it is possible to stack multiple buffers within PHP. See ob_get_level().
Sending HTML to the browser in larger chunks gives a performance benefit from a reduced network overhead.
Passing the data out of PHP in larger chunks gives a performance and capacity benefit by reducing the number of context switches required
Passing larger chunks of data to mod_gzip/mod_deflate gives a performance benefit in that the compression can be more efficient.
buffering the output means that you can still manipulate the HTTP headers later in the code
explicitly flushing the buffer after outputting the [head]. [/head] can allow the browser to begin marshaling other resources for the page before HTML stream completes.
Capturing the output in a buffer means that it can redirected to other functions such as email, or copied to a file as a cached representation of the content
You have it backwards. ob_start does not buffer the headers, it buffers the content. Using ob_start allows you to keep the content in a server-side buffer until you are ready to display it.
This is commonly used to so that pages can send headers ‘after’ they’ve ‘sent’ some content already (ie, deciding to redirect half way through rendering a page).
this is to further clarify JD Isaaks answer .
The problem you run into often is that you are using php to output html from many different php sources, and those sources are often, for whatever reason, outputting via different ways.
Sometimes you have literal html content that you want to directly output to the browser; other times the output is being dynamically created (server-side).
The dynamic content is always(?) going to be a string. Now you have to combine this stringified dynamic html with any literal, direct-to-display html . into one meaningful html node structure.
This usually forces the developer to wrap all that direct-to-display content into a string (as JD Isaak was discussing) so that it can be properly delivered/inserted in conjunction with the dynamic html . even though you don’t really want it wrapped.
But by using ob_## methods you can avoid that string-wrapping mess. The literal content is, instead, output to the buffer. Then in one easy step the entire contents of the buffer (all your literal html), is concatenated into your dynamic-html string.
(My example shows literal html being output to the buffer, which is then added to a html-string . look also at JD Isaaks example to see string-wrapping-of-html).