Функция PHP ob_get_length(): всё, что нужно знать
Функция ob_get_length() в PHP возвращает длину содержимого активного буфера вывода в байтах или false, если буферизация не активна.
ob_get_length() возвращает количество байт, находящихся в данный момент в активном буфере вывода PHP — содержимое, захваченное функцией ob_start(), но ещё не отправленное в браузер. Это удобно, когда нужно измерить сгенерированный вывод перед принятием решения: задать ограничение размера, сформировать заголовок Content-Length, записать размер полезной нагрузки в лог или просто проверить, было ли что-либо записано.
На этой странице рассматриваются сигнатура функции, её возвращаемое значение, особенности работы с вложенными буферами и несколько практических паттернов.
Синтаксис
ob_get_length(): int|falseФункция не принимает никаких аргументов. Она возвращает:
- целое число — длину данных в активном буфере вывода в байтах, или
false— если буферизация вывода не активна (ни один буфер не был запущен или все они уже закрыты).
Поскольку функция может возвращать false, всегда используйте сравнение через ===, а не нестрогую проверку, если нужно отличить «нет буфера» от буфера с длиной 0.
Базовый пример
<?php
ob_start();
echo "This will be buffered"; // 21 bytes
$length = ob_get_length();
ob_end_clean(); // discard the buffer
echo "Buffered length was: $length"; // Buffered length was: 21Здесь ob_start() начинает буферизацию, поэтому echo записывает данные в буфер, а не в браузер. ob_get_length() возвращает 21 (длина строки в байтах). Затем ob_end_clean() удаляет содержимое буфера — только финальный echo попадает в вывод.
Обратите внимание, что длина измеряется в байтах, а не в символах. Многобайтовая строка в кодировке UTF-8 будет содержать больше байт, чем видимых символов.
Проверка активности буфера
Когда буферизация не активна, функция возвращает false:
<?php
var_dump(ob_get_length()); // bool(false)
ob_start();
echo "hi";
var_dump(ob_get_length()); // int(2)
ob_end_clean();Это делает ob_get_length() быстрым способом проверить «что-либо сейчас буферизуется?» — тесно связанным с ob_get_level(), которая сообщает, сколько вложенных буферов открыто.
Вложенные буферы: измеряется только активный
Буферы в PHP могут быть вложенными. ob_get_length() всегда возвращает длину верхнего (внутреннего, текущего активного) буфера — но не суммарную:
<?php
ob_start();
echo "outer"; // 5 bytes in the outer buffer
ob_start();
echo "inner text"; // 10 bytes in the inner buffer
$inner = ob_get_length(); // measures the active (inner) buffer
ob_end_clean(); // discard inner
$outer = ob_get_length(); // outer is active again
ob_end_clean(); // discard outer
echo "inner=$inner outer=$outer"; // inner=10 outer=5Если нужна полная картина, используйте ob_get_level() для проверки каждого уровня и снимайте буферы по одному.
Практический паттерн: пропуск пустого вывода
Распространённый вариант использования — избежать отправки чего-либо (и накладных расходов связанных операций), если буферизованный фрагмент оказался пустым:
<?php
ob_start();
// ... template / partial that may or may not produce output ...
if (ob_get_length() > 0) {
// there is real content — send it
ob_end_flush();
} else {
// nothing was generated — drop the empty buffer
ob_end_clean();
}Чтобы получить сами буферизованные байты, а не только их длину, используйте ob_get_contents(); чтобы получить содержимое и закрыть буфер за один вызов — ob_get_clean().
Заключение
ob_get_length() возвращает длину активного буфера вывода PHP в байтах или false, если ни один буфер не открыт. Запомните три вещи: функция считает байты, измеряет только активный буфер во вложенном стеке, а возврат false означает, что буферизация отключена. В сочетании с остальными функциями управления выводом — ob_get_contents(), ob_get_clean() и ob_get_level() — она позволяет точно измерять и управлять сгенерированным выводом ещё до того, как он достигнет браузера.