W3docs

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

Практика

Практика
Какова функция ob_get_length() в PHP?
Какова функция ob_get_length() в PHP?
Was this page helpful?