Ob get status: примеры (PHP)

Использование ob_get_status для управления буфером вывода
Раздел: Буферизация вывода
ob_get_status(bool $full_status = false): array
Функция ob_get_status

Функция 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
        )

)
Похожие функции в PHP
  • ob_get_level(): Возвращает количество активных буферов вывода. Проще и быстрее, если нужен только уровень вложенности, а не детальная информация.
  • ob_get_contents(): Возвращает содержимое текущего буфера вывода, не затрагивая его. Используется для получения данных, а не метаинформации.
  • ob_list_handlers(): Возвращает массив с именами всех активных обработчиков вывода. Полезно для определения, какие обработчики используются.
  • ob_get_length(): Возвращает длину содержимого в текущем буфере. Альтернатива получению buffer_used из массива ob_get_status().

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

Типичные ошибки
Ожидание статуса при отсутствующем буфере

Вызов функции без активного буфера возвращает пустой массив или false (в зависимости от параметра).

<?php
$status = ob_get_status();
var_dump($status);
?>
array(0) {
}
Неправильная интерпретация уровня (level)

Уровень буфера (level) начинается с 0 для самого внутреннего (верхнего) буфера. Это может быть неочевидно при анализе полного статуса.

Использование устаревших флагов

В старых версиях PHP структура возвращаемого массива отличалась. Код, который сильно зависит от конкретных ключей, может сломаться при обновлении.

Изменения в 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
<?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
<?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
<?php
ob_start(null, 0, PHP_OUTPUT_HANDLER_CLEANABLE);
$status = ob_get_status();
echo "Тип флагов буфера: " . decbin($status['flags']);
ob_end_clean();
?>
Тип флагов буфера: 1110000
Обработка нескольких уровней

Динамическое управление вложенными буферами на основе их статуса:

Пример php
<?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 байт
Внутренний Внешний
Аналоги в других языках

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}")
Результат: Захваченный текст
JavaScript (Node.js)

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

PHP ob_get_status function comments

En
Ob get status Get status of output buffers