Страницы

Поиск по вопросам

четверг, 11 октября 2018 г.

разница между flush() и ob_flush()

Прошу вас, объясните наконец, ЧТО именно делают эти функции (объясните просто, я новичок) и какая между ними разница. Не понимаю, хоть убей, на форумах всех используют терминологию, котораял ишь путает тех, кто столкнулся с ними впервые. И что ещё за верхнии и нижнее слои стека буферов? Что за стек буферов? Что за слои? Если кто-то это доступно объяснит - это мне очень поможет. Заранее огромное спасибо


Ответ

Если в простых терминах пояснять, то когда вызывается echo/print, то данные идут на вывод (например браузер). Чтобы при многочисленных echo не гонять по байту существует выходной буфер, куда накапливаются выходные данные до какого то объема и при переполнении данные отправляются на выход. Потом снова происходит накопление данных. flush принудительно выбрасывает содержимое буфера в поток вывода.
Например, есть у вас долгая задача, где нужно постоянно досылать в браузер результаты и вы используете echo "информация". Но они накапливаются в буфере и браузер ничего не получит пока буфер не переполнится. flush после echo принудительно отправляет данные. Также буфер можно отключить, а в режиме cli его вообще нет.
ob_* позволяет же инициализировать свои вложенные буферы, наслаивая их друг на друга. И при очищении данные такого буфера будут попадать в нижележащий вплоть до дефолтного. А можно вообще не делать flush, а просто забрать накопленный результат из буфера и уничтожить его.
ob_start открывает новый буфер и все последующие print/echo будут попадать в него. В любой момент вы можете открыть новый буфер, а можете закрыть и сбросить данный на буфер открытый ранее. То есть это выглядит как слоенный пирог (стек) буферов, где данные пишутся в верхний буфер и только когда все буферы будут сброшены на нижележащие вплоть до дефолтного, только тогда данные уйдут не вывод.
Удобно это использовать в самописном шаблонизаторе. Для сегмента шаблона создаем буфер и потом забираем готовый хтмл и буфер уничтожаем. Или когда вызываем сторонний код который изобилует echo и создает мусор - мы его вызов оборачиваем в ob_* и весь этот мусор оседает там.
то есть flush сбрасывает системный буфер на вывод, а ob_flush сбрасывает последний открытый буфер через ob_start в нижележащий буфер (ob_* или системный)

Комментариев нет:

Отправить комментарий