Что такое buffer_size?

226
22 января 2018, 08:56

Когда я вызываю ob_get_status(), я получаю массив, в котором помимо прочего присутствуют строка buffer_size и chunk_size.

Что такое chunk_size я, кажется понял. Это значение output_buffering из php.ini либо которое задаётся через ob_start().

А вот что такое buffer_size я не понимаю? Я заметил, что его значение меняется в зависимости от заданного значения chunk_size.

Что это такое? Почему это зависит от chunk_size? Где в документации это отражено?

Answer 1

В документации, как видно - никак не отражено. Ну и ладно, пошли так почитаем. Как известно, PHP является проектом с открытым исходным кодом и написан на C.

  • код реализации PHP функции ob_get_status начинается в main/output.c на 1495 строке (на примере PHP 7.2.2)
  • если был запрошен full_status, то массив результата заполняется немного выше в методе php_output_stack_apply_status, который вызывает в свою очередь php_output_handler_status
  • там вполне видны все элементы результирующего массива. Интересующие buffer_size и buffer_used - это свойства структуры php_output_buffer

Как используются эти свойства можно почитать в этих же двух файлах, но суть сведётся к одному выводу:

Память операционной системой выделяется блоками, относительно быстродействия непосредственно кода выделение блока памяти более дорогостоящая операция. И что более неприятно для буфера вывода, если блока памяти не хватило и надо ещё несколько байт - возможно новый блок окажется в другом месте и потребуется копировать все данные в новое место. Поэтому в C для мест, где вероятно понадобится увеличение объёма данных нередко запрашивают буфер больше чем требуется в самом начале.

В итоге, buffer_size - это именно зарезервированный объём памяти в байтах, который сейчас выделен для хранения данных. buffer_used - сколько байт этого буфера занято. Показываются просто детали низкоуровневой реализации.

С chunk_size непосредственно не связан, но при достижении размера chunk_size данные отправляются на вывод, поэтому если chunk_size был задан - то мы заранее знаем максимальный объём необходимой памяти и можем выделить буфер ровно этого размера. Дальше ещё чуток логики - блок округляется до 4кб (для целей выравнивания блока по размеру страниц памяти операционной системы, судя по именам констант), если же chunk_size указан не был - то выделяется для начала 16кб.

READ ALSO
Удалить файл из директории при нажатии на ссылку

Удалить файл из директории при нажатии на ссылку

Привет коллеги, подскажите чем можетеНе могу сообразить как мне удалить из директории файлы, через кнопку на веб странице

320
Замена switch-case

Замена switch-case

Имеется конструкция switch-case со множеством вариантовКаким образом создать компонентно-ориентированный и легко масштабируемый архитектурный...

173