Ob get status: примеры (PHP)
ob_get_status(bool $full_status = false): arrayФункция ob_get_status() предоставляет информацию о состоянии буфера вывода (output buffering) в PHP. Она используется для получения текущего статуса буферизации, что позволяет управлять потоком вывода данных, например, для захвата содержимого, которое в обычном режиме отправляется браузеру немедленно.
Использование функции актуально при реализации кеширования, отладки, предварительной обработки контента (например, сжатия или замены строк), а также при построении сложных систем шаблонов.
Функция принимает один необязательный аргумент:
- $full_status (bool): Определяет полноту возвращаемого массива. Если аргумент установлен в
falseили не передан, возвращается информация только о верхнем (текущем) уровне буфера. Если установлен вtrue, возвращается массив с информацией о всех активных уровнях буферизации. По умолчаниюfalse.
Получение статуса текущего буфера:
<?php
ob_start();
echo 'Тестовый вывод';
$status = ob_get_status();
print_r($status);
ob_end_flush();
?>Array
(
[name] => default output handler
[type] => 0
[flags] => 112
[level] => 0
[chunk_size] => 0
[buffer_size] => 16384
[buffer_used] => 30
)Использование аргумента $full_status = true для вложенных буферов:
<?php
ob_start(); // Уровень 1
echo 'Уровень 1';
ob_start(); // Уровень 2
echo 'Уровень 2';
$status_all = ob_get_status(true);
print_r($status_all);
ob_end_flush();
ob_end_flush();
?>Array
(
[0] => Array
(
[name] => default output handler
[type] => 0
[flags] => 112
[level] => 0
[chunk_size] => 0
[buffer_size] => 16384
[buffer_used] => 20
)
[1] => Array
(
[name] => default output handler
[type] => 0
[flags] => 112
[level] => 1
[chunk_size] => 0
[buffer_size] => 16384
[buffer_used] => 20
)
)- ob_get_level(): Возвращает количество активных буферов вывода. Проще и быстрее, если нужен только уровень вложенности, а не детальная информация.
- ob_get_contents(): Возвращает содержимое текущего буфера вывода, не затрагивая его. Используется для получения данных, а не метаинформации.
- ob_list_handlers(): Возвращает массив с именами всех активных обработчиков вывода. Полезно для определения, какие обработчики используются.
- ob_get_length(): Возвращает длину содержимого в текущем буфере. Альтернатива получению
buffer_usedиз массиваob_get_status().
Функция ob_get_status() предпочтительнее, когда требуется комплексная информация о состоянии буфера (размер, флаги, обработчик). Для простых задач подойдут более специализированные функции.
Ob get status в Python
В Python нет прямого аналога буферизации вывода на уровне языка, как в PHP. Для захвата вывода используется io.StringIO или контекстный менеджер redirect_stdout из модуля contextlib.
import io
import sys
old_stdout = sys.stdout
sys.stdout = buffer = io.StringIO()
print('Захваченный текст')
sys.stdout = old_stdout
captured = buffer.getvalue()
print(f"Результат: {captured}")Результат: Захваченный текст
В Node.js можно перенаправить вывод консоли, переопределив методы console.log или используя модуль для перехвата потока.
const { Console } = require('console');
const { Writable } = require('stream');
let output = '';
const myStream = new Writable({
write(chunk, encoding, callback) {
output += chunk.toString();
callback();
}
});
const myConsole = new Console(myStream);
myConsole.log('Сообщение в буфере');
console.log('Захвачено:', output);Захвачено: Сообщение в буфере
Ob get status в MySQL
В MySQL подобная функциональность встроенными средствами не предоставляется, так как язык ориентирован на запросы, а не управление выводом.
Вызов функции без активного буфера возвращает пустой массив или false (в зависимости от параметра).
<?php
$status = ob_get_status();
var_dump($status);
?>array(0) {
}Уровень буфера (level) начинается с 0 для самого внутреннего (верхнего) буфера. Это может быть неочевидно при анализе полного статуса.
В старых версиях PHP структура возвращаемого массива отличалась. Код, который сильно зависит от конкретных ключей, может сломаться при обновлении.
- PHP 8.0: Изменилась структура возвращаемого массива для функции
ob_get_status(). Ключиdel,statusиmodeбыли удалены. Добавлены ключиflags,chunk_size,buffer_sizeиbuffer_usedдля большей детализации. - PHP 7.0+: Функция всегда возвращает массив. В более ранних версиях при вызове без активного буфера и с параметром
$full_status = trueмогла вернутьfalse.
Отслеживание заполненности буфера в реальном времени:
<?php
ob_start();
for($i = 0; $i < 10; $i++) {
echo str_repeat('x', 1024); // Пишем по 1 Кб
$status = ob_get_status();
echo "Итерация $i: Использовано {$status['buffer_used']} байт из {$status['buffer_size']}<br>";
}
ob_end_clean();
?>Итерация 0: Использовано 1082 байт из 16384 Итерация 1: Использовано 2147 байт из 16384 ... (вывод будет продолжаться)
Проверка статуса при использовании собственной callback-функции для буфера:
<?php
function my_handler($buffer, $phase) {
return strtoupper($buffer);
}
ob_start('my_handler');
echo 'текст в нижнем регистре';
$status = ob_get_status();
print_r($status['name']); // Имя обработчика
ob_end_flush();
?>my_handler ТЕКСТ В НИЖНЕМ РЕГИСТРЕ
Анализ поля type для понимания, как обрабатывается буфер:
<?php
ob_start(null, 0, PHP_OUTPUT_HANDLER_CLEANABLE);
$status = ob_get_status();
echo "Тип флагов буфера: " . decbin($status['flags']);
ob_end_clean();
?>Тип флагов буфера: 1110000
Динамическое управление вложенными буферами на основе их статуса:
<?php
ob_start();
echo 'Внешний ';
ob_start();
echo 'Внутренний';
$allStatus = ob_get_status(true);
foreach ($allStatus as $level => $info) {
echo "\nУровень {$info['level']}: используется {$info['buffer_used']} байт";
}
ob_end_flush();
ob_end_flush();
?>Уровень 0: используется 20 байт Уровень 1: используется 20 байт Внутренний Внешний