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

Работа с функцией ob_get_length для определения размера буфера в PHP
Раздел: Буферизация вывода
ob_get_length: int|false
Функция ob_get_length в PHP

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

Основное применение

Функция применяется в сценариях, где требуется знать размер генерируемого контента перед его отправкой: при динамической компрессии, проверке лимитов размера ответа, реализации прогресс-баров генерации страниц или логировании статистики.

Аргументы функции

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

Примеры использования ob_get_length
Базовый пример

Получение размера буфера после вывода строки:

<?php
ob_start();
echo 'Пример текста';
$length = ob_get_length();
echo "Длина буфера: $length байт";
ob_end_flush();
?>
Длина буфера: 26 байт
Проверка активности буферизации

Пример с обработкой случая неактивного буфера:

<?php
$length = ob_get_length();
if ($length === false) {
    echo 'Буферизация не активна';
} else {
    echo "Размер: $length байт";
}
?>
Буферизация не активна
Похожие функции PHP

Возвращает содержимое буфера вывода в виде строки. Позволяет не только измерить, но и манипулировать данными перед отправкой.

Определяет текущий уровень вложенности буферизации. Полезно при работе с несколькими вложенными буферами.

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

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

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

Ob get length в Python

В языке Python буферизация вывода часто реализуется через объекты StringIO или BytesIO:

from io import StringIO
import sys

old_stdout = sys.stdout
sys.stdout = buffer = StringIO()

print('Пример текста')
size = buffer.tell()
print(f'Размер буфера: {size} байт')

sys.stdout = old_stdout
Размер буфера: 26 байт
JavaScript (Node.js)

В Node.js для буферизации используют потоки или объекты Buffer:

const { Writable } = require('stream');

let bufferSize = 0;
const bufferStream = new Writable({
    write(chunk, encoding, callback) {
        bufferSize += chunk.length;
        callback();
    }
});

bufferStream.write('Пример текста');
console.log(`Размер буфера: ${bufferSize} байт`);
Размер буфера: 26 байт
Типичные ошибки
Проверка на строгое равенство

Некорректная проверка возвращаемого значения может привести к логическим ошибкам:

<?php
ob_start();
$length = ob_get_length();
if (!$length) { // Ошибка: при длине 0 условие также сработает
    echo 'Буфер пуст или не активен';
}
?>
Использование после очистки буфера

Попытка получить размер после ob_clean() или ob_end_clean() возвращает false:

<?php
ob_start();
echo 'Текст';
ob_clean();
$length = ob_get_length(); // false
var_dump($length);
?>
bool(false)
Изменения в версиях PHP

В PHP 8.0 существенных изменений в работе функции не произошло. Начиная с PHP 5.4, функция всегда возвращает false при неактивной буферизации, тогда как в более ранних версиях могла возвращать 0.

Расширенные примеры
Определение размера сжатого контента

Пример измерения размера буфера перед отправкой сжатых данных:

Пример php
<?php
ob_start('ob_gzhandler');
echo str_repeat('Контент ', 100);
$length = ob_get_length();
header('Content-Length: ' . $length);
ob_end_flush();
?>
Вложенная буферизация

Работа с несколькими уровнями буферизации:

Пример php
<?php
ob_start();
echo 'Внешний буфер ';
ob_start();
echo 'Внутренний буфер';
$innerLength = ob_get_length();
ob_end_flush();
$outerLength = ob_get_length();
echo "\nВнутренний: $innerLength, внешний: $outerLength";
ob_end_flush();
?>
Внешний буфер Внутренний буфер
Внутренний: 30, внешний: 72
Логирование статистики

Запись в лог размера сгенерированных страниц:

Пример php
<?php
ob_start();
// Генерация страницы
?>
<html><body>Содержимое</body></html>
<?php
$size = ob_get_length();
file_put_contents('stats.log', "Страница: $size байт\n", FILE_APPEND);
ob_end_flush();
?>

PHP ob_get_length function comments

En
Ob get length Return the length of the output buffer