Ob get length: примеры (PHP)
ob_get_length: int|falseФункция ob_get_length() возвращает длину содержимого в текущем буфере вывода. Она используется при работе с буферизацией вывода для получения размера данных, накопленных в буфере, без их непосредственной отправки браузеру или клиенту.
Функция применяется в сценариях, где требуется знать размер генерируемого контента перед его отправкой: при динамической компрессии, проверке лимитов размера ответа, реализации прогресс-баров генерации страниц или логировании статистики.
Функция не принимает параметров и возвращает целое число (длину буфера в байтах) или false, если буферизация не активна.
Получение размера буфера после вывода строки:
<?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 байт";
}
?>Буферизация не активна
Возвращает содержимое буфера вывода в виде строки. Позволяет не только измерить, но и манипулировать данными перед отправкой.
Определяет текущий уровень вложенности буферизации. Полезно при работе с несколькими вложенными буферами.
Возвращает детальную информацию о состоянии буфера, включая его размер, уровень и параметры.
Функцию 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 байт
В 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 8.0 существенных изменений в работе функции не произошло. Начиная с PHP 5.4, функция всегда возвращает false при неактивной буферизации, тогда как в более ранних версиях могла возвращать 0.
Пример измерения размера буфера перед отправкой сжатых данных:
<?php
ob_start('ob_gzhandler');
echo str_repeat('Контент ', 100);
$length = ob_get_length();
header('Content-Length: ' . $length);
ob_end_flush();
?>Работа с несколькими уровнями буферизации:
<?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
ob_start();
// Генерация страницы
?>
<html><body>Содержимое</body></html>
<?php
$size = ob_get_length();
file_put_contents('stats.log', "Страница: $size байт\n", FILE_APPEND);
ob_end_flush();
?>