Чтение буферов в PHP. Как управлять порядком вывода информации?

чтение буферов в php. как управлять порядком вывода информации?

Получение данных из буфера

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

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

Данная операция происходит с помощью функции ob_get_contents(). Она не принимает никаких параметров. В случае успешного завершения результатом станет содержимое буфера, но если буферизация отключена, вернется false. Нужно отметить, что ob_get_contents() получает информацию из текущего уровня стека. Если вы хотите сохранить данные и вернуться на предыдущий уровень, нужно также вызвать ob_end_clean().

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

//создаем временный файл и файловую базу данных
file_put_contents('temp-file', 'Текстовое содержимое нового файла');

$database = new SQLite3('test-db.db');
$database->query(
    'CREATE TABLE messages (
        id INTEGER PRIMARY KEY,
        content TEXT
    )'
);
$database->query(
    'INSERT INTO `messages` (`content`)
        VALUES("Привет из базы данных")'
);

ob_start();


//перехватываем вывод, сформированный через echo
echo "Начинаем наш простой, но очень важный эксперимент";
$echoString = ob_get_contents();
ob_end_clean();


//выводим содержимое, ранее созданного файла
readfile('temp-file');
$fileString = ob_get_contents();
ob_end_clean();


//получам контент из базы данных в виде массива
$queryResult = $database->query('SELECT * FROM `messages`');
$queryData = $queryResult->fetchArray();
ob_end_clean();


//осуществляем изменение сформированных данных
$echoString = str_replace('Начинаем', 'Заканчиваем', $echoString);
$queryData = json_encode(
    [$queryData['content'], 'Этого не было в базе данных'],
    JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE
);


//Меняем порядок выводимых данных
echo $fileString. '<br>';
echo $queryData . '<br>';
echo $echoString. '<br>';
/*
* Результат:
* Текстовое содержимое нового файла
* {
*     "Привет из базы данных",
*     "Этого не было в базе данных"
* }
* Заканчиваем наш простой, но очень важный эксперимент
*/

Заметка
Пример наглядно демонстрирует гибкость языка программирования PHP. Хоть программный код и выполняется построчно, использование буферизации позволяет осуществлять итоговую обработку перед выводом. Вам не обязательно мыслить «линейно» при написании программы.

Последние публикации