Буфер

Оригинальное название: buffer

Коротко

Область памяти, куда данные складываются на время — пока их не прочитают, не обработают или не отправят дальше, чтобы быстрый и медленный участники не ждали друг друга.

Что такое «Буфер»

Источник и получатель данных почти никогда не работают с одной скоростью. Диск отдаёт файл кусками, сеть то ускоряется, то замирает, PHP формирует страницу быстрее, чем медленный мобильный клиент её скачивает. Буфер — промежуточный склад между ними: одна сторона пишет, другая читает в своём темпе. Так устроены очереди ввода с клавиатуры, видеопамять, где собирается следующий кадр, буфер обмена и сетевые стеки.

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

Буфер и кеш — в чём разница

Оба термина означают временное хранение, но с разной целью. Буфер нужен для передачи: данные проходят через него один раз и уходят дальше. Кеш нужен для повторного использования: результат сохраняют, чтобы в следующий раз не вычислять или не скачивать заново. Буфер вывода PHP очищается после отправки страницы, а кеш страниц живёт, пока не истечёт срок или не изменятся данные.

Буферизация вывода в PHP

Всё, что выводится через echo, PHP может не отправлять сразу, а накапливать. Функции ob_* позволяют перехватить вывод и работать с ним как со строкой — например, получить HTML шаблонного фрагмента в WordPress:

ob_start();
get_template_part('parts/product-card');
$html = ob_get_clean();   // вывод не ушёл в браузер, а попал в переменную

wp_send_json(['html' => $html]);

Это удобно для AJAX-ответов и для кеширования готовых блоков. Буферизация также объясняет известную ошибку «headers already sent»: заголовки и cookie нельзя отправить после того, как часть страницы уже ушла клиенту.

Буферы в nginx

Веб-сервер тоже буферизует ответы приложения. Получив страницу от PHP-FPM, nginx складывает её в буферы в памяти и отдаёт клиенту сам, освобождая рабочий процесс PHP. Размеры задают директивы:

fastcgi_buffer_size 32k;
fastcgi_buffers 16 16k;

Если ответ не помещается в буферы, nginx записывает его во временный файл на диске, а в журнале ошибок появляется соответствующее предупреждение. Для обычных страниц хватает значений по умолчанию; увеличивать их имеет смысл, когда приложение отдаёт крупные ответы или очень длинные заголовки.

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение