Страницы

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

суббота, 7 декабря 2019 г.

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

#php #потоки_данных #стек


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


Ответы

Ответ 1



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

Ответ 2



Ответ прост потому как ob_flush очищает и выводит буфер созданыый ob_start - 'output buffer start' а flush очищает буфер вывода скрипта который и отправляет его вывод в браузер обычно это происходит по окончанию выполнения скрипта.

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

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