ob start php что это

ob_start

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_start — Включение буферизации вывода

Описание

Эта функция включает буферизацию вывода. Если буферизация вывода активна, никакой вывод скрипта не отправляется (кроме заголовков), а сохраняется во внутреннем буфере.

Некоторые веб-серверы (например, Apache) изменяют рабочую директорию скрипта при вызове callback-функции. Вы можете вернуть её назад, используя chdir(dirname($_SERVER[‘SCRIPT_FILENAME’])) в callback-функции.

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

Список параметров

Функция ob_gzhandler() была введена для облегчения отправки gz-кодированных данных браузерам, поддерживающим сжатые веб-страницы. ob_gzhandler() определяет тип кодировки содержимого, принимаемый браузером, и возвращает вывод соответствующим образом.

Параметр flags является битовой маской, которая управляет операциями, которые можно совершать над буфером вывода. По умолчанию она позволяет буферу вывода быть очищенным, сброшенным и удалённым, что равносильно значению PHP_OUTPUT_HANDLER_CLEANABLE | PHP_OUTPUT_HANDLER_FLUSHABLE | PHP_OUTPUT_HANDLER_REMOVABLE или PHP_OUTPUT_HANDLER_STDFLAGS как сокращение этой комбинации.

Возвращаемые значения

Возвращает true в случае успешного выполнения или false в случае возникновения ошибки.

Примеры

Пример #1 Пример callback-функции, определённой пользователем

Это всё равно что сравнить яблоки и апельсины.

Источник

PHP для начинающих. Буфер вывода // PHP

Продолжаю публиковать статьи из серии «PHP для начинающих», в этот раз речь пойдёт о буфере вывода.

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

Для начала, даю установку — буферов вывода в PHP несколько, плюс ещё модули web-сервера могут выполнять буферизацию, да ещё и браузеры могут играться с выводом и не сразу отображать полученный результат (надо бы тут освежить память, а то за упоминание Netscape могут освежевать).

Вот теперь буду рассказывать о буферизации в PHP.

Пользовательский буфер вывода

Работа с буфером вывода начинается с функции ob_start() — у данной функции есть три опциональных параметра, но о них я расскажу чуть позже, а пока запоминаем — для включения буфера вывода используем функцию ob_start() :

Практически все нужные нам функции имеют префикс «ob_», как не трудно догадаться это сокращение от «output buffer»

Функцию ob_get_contents() можно вызывать множество раз, на практике с таким не сталкивался:

Если вы стартанули буфер вывода, но по какой-то причине не закрыли его, то PHP это сделает за вас и в конце работы скрипта выполнит «сброс» буфера вывода в браузер пользователя

Если внутри блока ob_start – ob_end вы отправляете заголовок, то он не попадает в буфер, а сразу будет отправлен в браузер:

В результате выполнения данного кода в http-пакете появятся следующие заголовки:

Естественно, данный код больше ничего не выводит, будет пустая страница.

Перед вами небольшой life-hack – в PHP вы можете использовать скобочки <> для выделения некой логики в блоки, при этом никакой функциональной нагрузки они не несут, а вот читаемость кода – повышают

Чуть-чуть прояснили ситуацию — теперь в копилке наших знаний есть информация о том, как включить буфер, как получить из него данные, и как выключить. Что ещё интересное можно с ним вытворять? Да с ним практически ничего толком и не сделать — его можно отправить (сбросить) в браузер (ключевое слово flush), очистить (clean), отключить (end). Ну и скомбинировать это всё до кучи тоже можно:

Для простого запоминания вот вам наглядная табличка по данному семейству функций:

вернёт очистит отправит отключит
ob_get_contents X
ob_clean X
ob_flush X
ob_end_clean X X
ob_end_flush X X
ob_get_clean X X X
ob_get_flush X X X

Задание
Дополните приведенный ниже код вызовом одной функции, чтобы он корректно вывел «hello world»:

Обработчик буфера

В данном примере функция обработчик вернёт строку «Length of string ‘hello world’ is 11».

Важный момент — с этими функциями нужно быть поосторожней, обработали строки и ладненько, но не пытайтесь вывести либо сохранить данные, не пытайтесь стартовать другой буфер вывода внутри функции, и да есть функции которые создают буфер вывода внутри себя, вот print_r() и highlight_file() тому пример

Из стандартных же обработчиков можете повстречать ob_gzhandler(), но лучше сжатие страничек оставлять на плечах web-сервера, и не вешать это на PHP.

We need to go deeper©

У буфера вывода есть килер-фича – внутри буфера можно стартовать ещё один буфер, а внутри нового ещё и так далее (пока памяти хватает):

В данном примере функция ob_flush() и производные от неё, будут «выбрасывать» содержимое буфера на более высокий уровень.

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

Если вы не знаете точно на какой «глубине» находитесь – то воспользуйтесь функцией ob_get_level(), а чтобы «проснуться» вам пригодится следующий код:

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

Буфер «по умолчанию»

Запомните, для CLI приложений директива output_buffering всегда 0, т.е. данный буфер отключен

Зачем это всё?

Хороший вопрос — зачем нужна работа с буфером вывода? Приведу несколько основных сценариев использования:

Сценарий обработки ошибок в подключаемых файлах — стартуете буфер, подключаете файлы, если что-то пошло не так, то содержимое буфера можно скинуть, и вместо неинформативного сообщения об ошибке, выводите не менее информативное сообщение, что сервер приболел, и не может больше ничего.
Пример работы с критическими ошибками вы можете найти в статье Обработка ошибок, и там тоже упоминается буфер вывода, ох видать всё это ж-ж-ж неспроста

Системный буфер вывода

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

Вот так всё просто и кратко, ну а теперь о нюансах управления системным буфером вывода…

Royal flush

10 секунд вашего внимания…

А теперь из академического интереса давайте рассмотрим реализацию данного «экшена» – там совсем чуть-чуть кода, и небольшая горстка полезных знаний по PHP:

Сразу бросается в глаза вызов функции flush() — вызвав данную функцию вы даёте указание PHP «сбросить» системный буфер, т.е. отправить всё что там есть в браузер пользователю (но учтите, если у вас стартован пользовательский буфер, то для начала надо будет «сбросить» его, и уже потом вызвать flush() ). Т.е. происходящее можно описать как:

Задание

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

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

Рекомендованная литература

В заключение

К теме буферизации вы ещё не раз вернётесь во время работы над PHP проектами, и поверьте, нужно знать и понимать на каком этапе «застрял» ваш вывод, чтобы не тратить время зря на диагностику работающего кода, а переходить непосредственно к причинам возникновения проблем.

Источник

ob_start

Описание

void ob_start ([string output_callback])

Эта функция включает буферизацию вывода. Если буферизация вывода активна, никакой вывод скрипта не высылается (кроме шапок/headers); вывод сохраняется во внутреннем буфере.

Содержимое этого внутреннего буфера может быть скопировано в строковую переменную с использованием ob_get_contents(). Для вывода содержимого этого внутреннего буфера используйте ob_end_flush(). Альтернативно ob_end_clean() втихую отбрасывает содержимое буфера.

Может быть специфицирована необязательная функция output_callback. Эта функция принимает строку как параметр и должна возвращать строку. Функция будет вызвана при вызове ob_end_flush(), или если буфер выводится в браузер в конце запроса. Когда вызывается output_callback, она примет содержимое буфера вывода как параметр и по идее должна возвратить новый буфер вывода как результат, который будет направлен в браузер.

Примечание:в PHP 4.0.4 ob_gzhandler() была введена для облегчения отправки gz-кодированных данных web-браузерам, поддерживающим сжатые web-страницы. ob_gzhandler() определяет тип кодировки содержимого, принимаемый браузером, и возвращает вывод соответствующим образом.

Буферы вывода стэкируются, то есть вы можете вызвать ob_start(), когда активна другая ob_start(). просто убедитесь, что вы вызываете ob_end_flush() соответствующее количество раз. Если актины несколько callback-функций, вывод последовательно фильтруется для каждой из них в порядке вложения.

ob_end_clean(), ob_end_flush(), ob_clean(), ob_flush() и ob_start() не могут вызываться из callback. Если вы вызовете их из callback-функции, поведение не определено. Если вы хотите удалить содержимое буфера, возвратите «» (нулевую строку) из callback.

Источник

Что такое буферизация вывода 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() выводит содержимое из буфера и завершает буферизацию вывода. Буфер не стирается.

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

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

Что вы не узнаете из документации, момент с дырой в безопасности + советы о том, как ускорить отклик сервера.

Буферизация вывода позволяет вам сохранять выходные данные PHP (в основном генерируемые echo, var_dump, print_r) в памяти (т.е. в буфере) вместо немедленной передачи в браузер или терминал. Что полезно для самых разных задач:

Предотвращение вывода «на экран»:

Захватить вывод и записать в переменную: (Таким образом можно создавать кэш)

Функции ob_get_contents() и ob_end_clean() могут быть заменены одной функцией: ob_get_clean(), в ее имени больше нет «end» хотя фактически она отключает буферизацию вывода:

В приведенных выше примерах полученный буфер не был отправлен на выход. Если вы хотите отправить его, используйте ob_end_flush() вместо ob_end_clean().

Чтобы получить содержимое буфера, отправить его на выход и отключить буферизацию, есть ещё одна функция (включая отсутствующий end в имени): ob_get_flush().

Буфер так же может быть очищен в любое время не выключая его, используя функцию ob_clean() (очищает буфер) или ob_flush() (отправляет буфер на выход):

В буфер также отправляются выходные данные, записанные в выход php://output, буферизацию можно избежать, записав в php://stdout (или STDOUT), который доступен только в CLI, т.е. при запуске скриптов из командной строки.

Гнездование (вложенные буферы)

Буферы могут быть вложенными, поэтому, когда один буфер активен, другой ob_start() активирует новый буфер. Таким образом, ob_end_flush() и ob_flush() на самом деле отправляют буфер не на выход, а в родительский буфер. И только при отсутствии родительского буфера содержимое отправляется в браузер или терминал.

Поэтому важно отключить буферизацию, даже если происходит исключение:

Размер буфера (chunk_size)

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

Когда размер буфера превышает 4096 байт, PHP автоматически выполняет flush, т.е. буфер очищается и отправляется. То же самое может быть достигнуто установкой директивы output_buffering, которая игнорируется в CLI.

HTTP заголовки

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

Дыра в безопасности

Когда скрипт PHP завершится, все ожидающие буферы запишут его содержимое в выход. Это можно вполне себе считать раздражающей дырой в безопасности. Если вы готовите в буфере конфиденциальные данные, которые не предназначены для вывода, и например, возникает ошибка, PHP записывает их в вывод. Решение состоит в том, чтобы использовать пользовательский обработчик:

Пользовательские обработчики

Вы можете установить свой собственный обработчик, т.е. функцию, которая будет обрабатывать содержимое буфера перед отправкой:

Этапы start, final и flush (так же clean) могут происходить одновременно. Это можно различить с помощью бинарного оператора &:

Является переводом статьи с phpfashion, здесь очень хорошо описана буферизация в PHP на английском языке. 🙂

Источник

Читайте также:  У клеща нашли боррелиоз что делать
Обучающий онлайн портал