Что такое буферизация вывода PHP?

Буферизация вывода — одна из тех концепций в PHP, с которой достаточно часто сталкиваются разработчики, но обычно никто даже не задумывается, как она устроена. Мы перевели текст What is PHP Output Buffering? разработчика Лары Шенк, в котором она детально объясняет эту концепцию.

Что такое буферизация вывода?

Функции

Пример

Заголовки HTTP

Вывод

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 в нужном месте, и вывести буфер либо на страницу, либо в переменную, прежде чем вы его очистите.

Hi, my name is .

I like .

Зачем мне использовать буферизацию?

Вполне возможно, что вы никогда не будете использовать буферизацию вывода, особенно если вы не являетесь разработчиком плагинов 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-файлы». В ином случае вы просто столкнетесь с ошибкой, про которую я писал чуть выше.

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

Вывод

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

Что такое буферизация вывода PHP?
Получить консультацию у специалистов DST
Напишите нам прямо сейчас, наши специалисты расскажут об услугах и ответят на все ваши вопросы.
Комментарии
RSS
Вам может быть интересно
В современном мире технологий концепция SaaS (Software as a Service) стала неотъемлемой частью бизнеса. SaaS-приложения предоставляют пользователям доступ к программному обеспечению через интернет без...
Зачем использовать TypeScript для своих проектов? Основная цель TypeScript &mdas...
Прочтите это руководство от разработчиков DST Glob...
Ознакомьтесь с подробностями методологий разработк...
Прочтите это руководство от специалистов DST Globa...
Как работает веб?В этой статье разработчики DST Gl...
Рассказываем, зачем и где учить PHP, где его приме...
Современные сайты интерактивные и динамичные &m...
В Последние годы Web-приложения постепенно вытесня...
По результатам ежегодного отчёта State of the Octo...

Новые комментарии

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

Заявка на услуги DST

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

Адрес

Россия, Ижевск, ул.Салютовская,
д.1, офис 17

8 495 1985800
Заказать звонок

Режим работы: Пн-Пт 10:00-19:00

info@dstglobal.ru

Задать вопрос по почте

Укажите ваше имя
Укажите ваше email
Укажите ваше телефон