28.2. PHP: Включение буфера, пересылка и очистка
Как и при любой операции, интерпретатору необходимо показать, откуда он будет производить запись данных вывода в буфер. Помимо этого необходимо указать, в каком месте скрипта прекращается запись данных в буфер. Для решения этих задач и были созданы функции:
• ob_start(),
• ob_end_flush(),
• ob_end_clean().
Для установления буфера ввода необходимо воспользоваться функцией ob_start(), чтобы показать интерпретатору, что именно с этого места будет происходить запись всех данных, выводимых в буфер. Функция ob_start() подчиняется следующему синтаксису:
void ob_start([string output_callback])
Эта функция устанавливает буферизацию выхода, т. е. после того, так она задана, все данные выхода будут сохраняться в буфере. Во время как буферизация выхода является активной, никакой выход не передается от сценария, вместо этого сохраняются данные во внутреннем буфере.
Содержание этого буфера может быть скопировано (передано) в строковую переменную при помощи функции ob_get_contents(). Чтобы вывести все, что сохранено во внутреннем буфере, используют функцию ob_end_flush(). В качестве альтернативы можно применить функцию ob_end_clean(), которая отбросит (очистит) буферное содержание.
Необязательная функция может быть как определена, и неопределена. Эта функция использует строку как параметр и возвращает также строку. Функция будет вызвана совместно с вызовом функции ob_end_flush() или когда буфер вывода находится в браузере в конце запроса. Когда вызывается функция output_callback, содержание буфера вывода принимается как ее параметр, и в последующем, гак и ожидается, возвращается новый буфер вывода, который в результате и будет послан браузеру.
Буферы вывода являются наращиваемыми, это значит, что можно производить вызов функции ob_start() повторно, в то время какдругая функция ob_start() является активной. Главное при повторных вызовах данной функции — убедиться в том, что функция ob_end_flush() вызвана такое же количество раз, сколько и функция ob_start(). Если многократно вызванные функции являются активными, происходит последовательная фильтрация вывода в соответствии с вложенным порядком.
Пример 28.1. Работа с буфером
<?php
function call($buff) {
return($buff);
}
ob_start("call");
?>
<html>
<body>
<h3> Выведен содержащийся буфер, <br>
так как никаких операций в функции call<br>
с ним не произошло. <br>
</body>
</html>
<?php
ob_end_flush();
?>
Функцией ob_start("rall"); мы показали интерпретатору, что нам необходимо передать все данные буфера в функцию call. После того как они посланы, программа передает управление функции и эти данные буфера обрабатывает. В нашем случае функция пустая, она пропускает через себя имеющиеся данные буфера и возвращает их без изменения. В конце скрипта вызвана функция ob_end_flush(). Она показывает интерпретатору, что после этой строки ввод данных в буфер прекращается, т. е. все, что вводится дальше, уже не будет помещаться в буфер. После того как функция ob_end_flush() обработала данные буфера, она их возвращает. В нашем случае это сделано при помощи операции return ($buff);. В итоге на экран браузера будет выведено:
Выведен содержащийся буфер,
так как никаких операций в функции call
с ним не произошло.
Браузер обрабатывает теги, поэтому на экране их не будет — будет видна только выводимая фраза.
Функция ob_end_flush() используется, как правило, совместно с ob_start(). Она позволяет ограничивать ввод данных в буфер, а также пересылать буфер, т. е. она не очищает буфер, а позволяет выводить данные, имеющиеся в буфере. Функция имеет следующий синтаксис:
Эта функция отправляет содержание буфера вывода (если оно есть в наличии) и помимо этого прерывает операции введения данных в буфер. Для обработки данных буфера используют функцию ob_get_contents(), но только в том случае, пока не вызвана функция ob_end_flush(), поскольку доступ к данным буфера будет закрыт после ее применения. Данная функция была применена в примере 28,1.
Если после закрытия ввода данных в буфер нужно его очистить, используют функцию ob_end_clean(), которая удаляет данные буфера. Функция имеет следующий синтаксис:
Если в примере 28.1 заменить функцию ob__end_flush() на ob_end_clean (), то возвращаемыми данными функции call() будет пустая строка, так как функция ob_end_clean() до того как переслать данные буфера, просто произведет его очистку. Именно это и делает различным функции.
ВНИМАНИЕ
Функция ob_end_clean() используется только в версии РНР
4.