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

Аналоги в других языках

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

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

Вызов функции без активного буфера возвращает пустой массив или 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 байт
Внутренний Внешний

PHP ob_get_status function comments

En
Ob get status Get status of output buffers