Главная > Программирование > РНР: настольная книга программиста
<< Предыдущий параграф
Следующий параграф >>
<< Предыдущий параграф Следующий параграф >>
Макеты страниц

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(). Она позволяет ограничивать ввод данных в буфер, а также пересылать буфер, т. е. она не очищает буфер, а позволяет выводить данные, имеющиеся в буфере. Функция имеет следующий синтаксис:

void ob_end_flush(void);

Эта функция отправляет содержание буфера вывода (если оно есть в наличии) и помимо этого прерывает операции введения данных в буфер. Для обработки данных буфера используют функцию ob_get_contents(), но только в том случае, пока не вызвана функция ob_end_flush(), поскольку доступ к данным буфера будет закрыт после ее применения. Данная функция была применена в примере 28,1.

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

void ob_end_clean(void);

Если в примере 28.1 заменить функцию ob__end_flush() на ob_end_clean (), то возвращаемыми данными функции call() будет пустая строка, так как функция ob_end_clean() до того как переслать данные буфера, просто произведет его очистку. Именно это и делает различным функции.


ВНИМАНИЕ

Функция ob_end_clean() используется только в версии РНР


4.
<< Предыдущий параграф Следующий параграф >>
Оглавление