ob_end_flush — очищает (отправляет) буфер вывода и отключает буферизацию вывода.


Функция Ob_end_flush

Функция Ob_end_flush отключает буферизацию и выводит содержимое буфера.
Аргумент Void данной функции указывает лишь на то, что функция объявляется без параметров.

Функция Ob_end_flush отправит содержимое буфера вывода (если оно имеется) и отключит эту буферизацию вывода. Если вы хотите использовать содержимое буфера, то вам необходимо вызвать Ob_get_contents перед Ob_end_flush, то есть все содержимое буфера удаляется при вызове Ob_end_flush.

Буфер вывода должен запускаться функцией Ob_start с флагами PHP_OUTPUT_HANDLER_FLUSHABLE и PHP_OUTPUT_HANDLER_REMOVABLE.

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

Функция Ob_end_flush возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Основной причиной неудачного завершения работы функции является ее вызов без активной буферизации или если буфер не может быть удален. Если функция завершается ошибкой генерируется E_NOTICE:
Пример использования:
Результатом выполнения будет строка ‘Hello World‘, которую выведет функция Ob_end_flush.

PHP буфер ob_flush () против flush ()

В чем разница между ob_flush() а также flush() и почему я должен звонить обоим?

Эта функция отправит содержимое буфера вывода (если есть).

Сбрасывает буферы записи PHP и все, что использует внутренний сервер PHP (CGI, веб-сервер и т. Д.).

Тем не менее, он продолжает говорить:

[он] может не иметь возможности переопределить схему буферизации вашего веб-сервера …

Итак, мне кажется, что я мог бы просто использовать ob_flush() Все время. Тем не менее, я получаю странные результаты, когда я делаю это. Может ли кто-нибудь объяснить простыми словами, что здесь происходит?

Решение

ob_flush отправляет инициированный приложением буфер. Может быть несколько вложенных ob_start() в любом скрипте PHP. ob_flush передает текущий контент на верхний слой.

Сам PHP может (по своему усмотрению) буферизовать вывод. Это зависит от серверной части. Но обычно FastCGI имеет буфер сокетов самостоятельно. Следовательно flush() Необходимо также вызвать для отправки текущего содержимого на веб-сервер.

И теперь веб-сервер может сам реализовать другую схему буферизации ( mod_deflate или контент-фильтр), на который вы не имеете никакого влияния. Но это редко, так как его нужно специально настраивать.

Во всяком случае, используйте оба.

Другие решения

ob_flush очищает выходные буферы вы созданный с помощью функции, как ob_start

flush сбрасывает буферизованный вывод самого скрипта PHP его вызывающей стороне

ob_flush() флеш высокого уровня. Он очищает высокоуровневые буферы и помещает весь контент в низкоуровневые внутренние буферы, готовые к отправке.

  • Обратите внимание, что ob_ семейство функций создать стеки буферов, так что просто слепо писать ob_flush() везде действительно будет давать «странные результаты», если код был написан, чтобы воспользоваться преимуществами этого стекирования.

flush() это низкоуровневая очистка, указывающая PHP очищать свои внутренние низкоуровневые буферы данных.

Ниже этого все еще будут буферы уровня сокета; ниже этого есть буферы сетевого уровня. И, на самом низком уровне, очередь электронов, идущая по кабелю данных.

Я думаю, это связано с вашим предыдущий вопрос . Существенное преимущество использования буферизации вывода заключается в том, что она используется вместе со сжатием данных. Если вы не используете ob_gzhandler , мало что можно получить. flush один будет просто фиксировать любые выходные данные на сервере. С ob_start и его аналоги ob_flush , ob_end_clean а также ob_end_flush все, что ждет, чтобы быть сжатым (посмотрите на flush а также ob_flush что касается разных ведер — ob отправляет данные в flush , flush отправляет данные в браузер — может быть неточным, но это идея), будет завернут и отправлен клиенту.

Как отключить буферизацию вывода в PHP

Я написал простой сценарий ретрансляции, который подключается к веб-камере и читает из сокета и выводит эти данные с помощью функции печати. Данные представляют собой данные MJPG с уже настроенными границами. Я просто выводим данные, которые читаются.

Проблема заключается в том, что PHP, похоже, выполняет буферизацию этих данных. Когда я устанавливаю камеру на 1 FPS, питание будет зависеть на 7-8 секунд, а затем быстро отобразит 8 кадров. Если я установил разрешение на огромный размер, камера будет двигаться более или менее 1 кадр в секунду. Я предполагаю, что тогда происходит буферизация (поскольку огромные размеры заполняют буфер быстро, а низкие – нет), и я не могу понять, как отключить эту буферизацию. Кто-нибудь знает, как это сделать?

Версия tl; dr

Сделайте две вещи:

Отключите буфер вывода пользовательского пространства, либо …

В глобальном масштабе, либо …

Илон Маск рекомендует:  Что такое код asp hcmaxdiskspaceusage

    Выключение функции output_buffering в php.ini или

Отключение output_buffering в вашей конфигурации Apache, используя

или просто для сценария, о котором вы заботитесь, либо …

Кроме того, отключите буфер вывода на уровне сервера столько, сколько вы можете, либо:

  • вызов ob_implicit_flush() в начале вашего скрипта или
  • вызов flush() после каждого выражения echo или другого оператора, который добавляет вывод в тело ответа

Более длинная версия

Смутно, есть два уровня буферизации, которые могут быть релевантными, и документация по PHP плохо справляется с различием между ними.

Выходной буфер

Первый уровень обычно упоминается в документах PHP как «выходной буфер». Этот уровень буферизации влияет только на вывод в тело ответа HTTP, а не на заголовки. Вы можете включить буферизацию вывода с помощью ob_start() и отключить ее с помощью ob_end_flush() или ob_end_clean() . Вы также можете запустить все свои скрипты с буферизацией вывода с использованием опции output_buffering в php.ini.

Значение по умолчанию этого параметра для производственных версий php.ini составляет 4096, что означает, что первые 4096 байтов вывода будут буферизованы в выходном буфере, после чего он будет сброшен и буферизация вывода будет отключена.

Вы можете отключить этот уровень буферизации глобально, установив output_buffering в Off в файле php.ini (или используя

в вашем Apache config, если вы используете Apache). Кроме того, вы можете отключить его для одного сценария, вызывая ob_end_clean() или ob_end_flush() в начале скрипта.

Буфер записи и буфер веб-сервера

Помимо выходного буфера – это то, что руководство PHP называет как «буфер записи», плюс любая система буферизации, которую имеет ваш веб-сервер. Если вы используете PHP с Apache через mod_php и не используете mod_gzip , вы можете вызвать flush() чтобы очистить их; с другими бэкендами, это тоже может сработать, хотя руководство сдержанно дает заверения:

Описание

Сбрасывает буферы записи PHP и любые внутренние ресурсы PHP (CGI, веб-сервер и т. Д.). Это позволяет сделать текущие выходные данные в браузере с несколькими оговорками.

flush () не сможет переопределить схему буферизации вашего веб-сервера и не влияет на буферизацию на стороне клиента в браузере. Он также не влияет на механизм буферизации вывода пользовательского пространства PHP. Это означает, что вам придется вызывать оба ob_flush () и flush (), чтобы очистить выходные выходные буферы, если вы их используете.

Существует также несколько способов, с помощью которых PHP может автоматически вызывать flush() каждый раз, когда вы echo отзываете что-либо (или делать что-либо еще, что выводит результат на тело ответа).

Первый – вызов ob_implicit_flush() . Обратите внимание, что эта функция обманчиво названа; учитывая его префикс ob_ , любой разумный человек ожидает, что он повлияет на «выходной буфер», как и ob_flush , ob_flush и т. д. Однако это не так; ob_implicit_flush() , например flush() , влияет на выходной буфер на уровне сервера и никак не взаимодействует с выходным буфером, контролируемым другими функциями ob_ .

Второй – глобальное включение неявной промывки, установив флаг implicit_flush в On в вашем php.ini. Это эквивалентно вызову ob_implicit_flush() в начале каждого скрипта. Обратите внимание, что руководство советует против этого, загадочно ссылаясь на «серьезные последствия для производительности» , некоторые из которых я исследую в этом касательном ответе .

Вместо отключения буферизации вывода вы можете просто вызвать flush() после каждой операции чтения. Это позволяет избежать проблем с конфигурацией сервера и делает ваш скрипт более переносимым.

Мы можем предоставить приведенный ниже код в файле .htaccess для отключения буферизации вывода в PHP

Буферизация вывода может быть многослойной, и у меня были случаи, когда более ранний код делал несколько уровней. Это очистит их всех.

Я знаю, что этот вопрос немного устарел, но, вернувшись к этому вопросу, вы можете отключить буферизацию вывода на сценарии на основе сценария, например:

Это должно отключить всю буферизацию вывода для любого сценария, который следует за ней.

Как отключить буферизацию вывода в PHP

Я написал простой скрипт реле, которое подключается к веб-камере и читает из сокета, и выводит эти данные с помощью функции печати. Данные MJPG данных с границами уже настройки. Я просто выводить данные, которые считываются.

Проблема заключается в PHP, как представляется, буферные эти данные. Когда я установил камеру на 1 FPS, подача замерзнет в течение 7-8 секунд, а затем быстро отображать 8 кадров. Если установить разрешение на огромный размер, перемещать камеру на более или менее 1 кадр в секунду. Я предполагаю, что тогда некоторые буферизация происходит (так как огромные размеры заполнения буфера быстро, и низкие размеры не делают), и я не могу понять, как отключить эту буферизацию. Кто-нибудь знает, как?

ТЛ; др версия

Отключение выходного буфера в пользовательском пространстве, либо .

Во всем мире, либо .

    Выключение output_buffering в вашем php.ini, или

Выключение output_buffering в вашей Apache конфигурации с помощью

или просто сценарий, вы заботитесь о, либо .

  • вызова ob_end_flush() или
  • призвание ob_end_clean()

Кроме того, отключение выходного буфера на уровне сервера, насколько это возможно, либо:

  • вызывая ob_implicit_flush() в начале вашего скрипта, или
  • вызова flush() после каждого echo заявления или другого заявления , которое добавляет вывод в тело ответа


Илон Маск рекомендует:  Что такое код asp path

дольше версия

Смутно, есть два слоя буферизации, которые могут иметь отношение и документация PHP делает плохую работу различия между ними.

Выходной буфер

Первый слой, как правило , ссылаются на PHP документах как «» выходного буфера. Этот слой буферизации влияет только на выход к телу ответа HTTP, а не заголовки. Вы можете включить буферизацию вывода с ob_start() , и выключить его ob_end_flush() или ob_end_clean() . Вы также можете иметь все ваши скрипты автоматически начинаются с буферизацией вывода об использовании output_buffering опции в php.ini.

Значение по умолчанию этой опции для производства версий php.ini 4096, что означает , что первые 4096 байт выхода будут буферные в выходном буфере, после чего она будет очищена и буферизация вывода выключена.

Вы можете отключить этот слой буферизации глобально, установив output_buffering для Off в файле php.ini (или с помощью

в вашей Apache конфигурации, если вы используете Apache). Кроме того , вы можете отключить его для одного сценария по телефону ob_end_clean() или ob_end_flush() в начале сценария.

Буфер записи, а буфер веб-сервер

Помимо выходного буфера является то , что PHP руководство относится к как «буфер запись», плюс буферная система ваш веб — сервер имеет. Если вы используете PHP с Apache через mod_php , и не используется mod_gzip , вы можете позвонить , flush() чтобы смыть их; с другими движками, он может работать также, хотя руководство скрытное о предоставлении гарантии:

Описание

Очищает буферы записи из PHP и все, что бэкенд PHP использует (CGI, веб-сервер и т.д.). Это попытка подтолкнуть Токовый выход всего путь к браузеру с некоторыми оговорками.

Flush () не может быть в состоянии перекрыть схему буферизации вашего веба — сервер , и это не имеет никакого эффекта на любой сторону клиента буферизации в браузере. Он также не влияет на механизм буферизации вывода в пользовательском пространстве РНР. Это означает , что вы должны будете звонить как ob_flush () и флеш () для очистки выходных буферов О.Б. , если вы используете их.

Есть также несколько способов , которые вы можете сделать PHP автоматически вызывать flush() каждый раз , когда вы echo что — нибудь (или сделать что — нибудь еще , что перекликается выход к телу ответа).

Первый заключается в вызове ob_implicit_flush() . Обратите внимание , что эта функция обманчиво имени; учитывая его ob_ префикс, любой разумный человек будет ожидать , что это будет влиять на «выходной буфер», как это делают ob_start , и ob_flush т.д. Тем не менее, это не так; ob_implicit_flush() , Как flush() , влияет на выходной буфер уровня сервера и не взаимодействует каким — либо образом с выходным буфером под контролем других ob_ функций.

Ob_end_flush — очищает (отправляет) буфер вывода и отключает буферизацию вывода.

В некоторых случаях требуется чтобы скрипт на PHP выводил свои данные в браузер без буфферизации, непосредственно после команд echo или print_r.
Например, при написании долгоиграющего скрипта, который должен быть запущен при помощью pdem, чтобы выводить из скрипта прогресс выполнения и прочие данные в сервер pdem, понадобится отключить буферизацию.
Как выяснилось, в интернете есть целая куча разных рекомендаций и решений вопроса отключения буферизации, который пришлось объединить в одно целое, чтобы добиться цели. В моём случае, буфферизация Nginx и Yii вставляли палки в колёса.
Здесь я представляю данное решение.

/** * Перейти в режим отключённой буферизации * @param boolean $closeSession Сохранить и закрыть сессию. * Нужно, если скрипт долгоиграющий, и вы не хотите, * чтобы, пока он работает, у вас заклинивало весь остальной сайт. */ function switchOffBuffering($closeSession=true) < if ($closeSession) < //Сохраним и закроем сессию, если надо. session_write_close(); >//Сообщим серверу и браузеру, что кэшировать выдачу не надо. header(«Cache-Control: no-cache, must-revalidate»); //Сообщим серверу Nginx, что буферизировать не надо header(‘X-Accel-Buffering: no’); //Включим автоматический сброс буфера при каждом выводе ob_implicit_flush(true); //Сбросим все уровни буферов PHP, созданные на данный момент. while (ob_get_level() > 0) < ob_end_flush(); >>

4 комментария

Спасибо за интересную функцию (грамотно собрали в кучу все способы отключения буферизации).

На здоровье. Я как раз заглянул в этот пост и увидел что у меня неправильно преобразовались кавычки и знак «>» в html entities, поправил.

Уже несколько дней занимался одной функцией. Не мог дальше js писать после реализации php, вечная беда err_connection_reset. Методом проб и ошибок определил что проблема вылетает с самого nginx. Начал искать что и как и пришёл сюда статью почитать, в итоге отключил буферизацию именно на этот скрипт и больше никакой ошибки. Жаль что быстрее не нашёл. Статья очень помогла!

Повезло, что это помогло. err_connection_reset может иметь огромное количество причин, вплоть до кривой прошивки домашнего роутера. Спасибо за отзыв ��

ob_end_flush() — не работает. Не могу выяснить причину

Добрый день дорогие друзья. На днях появилась проблема с ob_end_flush() , она перестала работать. Причину не могу выяснить. Код таков.

Поставил else тоже не дало результата при случае false. а когда убираю if(ob_end_flush()) < >flush(); то все работает. Единственное но, это то, что результат выводит но не так как надо ;

1 ответ 1

Как написано в комментах — сайт на фреймворке codeinterger . А фреймфорки зачастую используют вложенную схему ob. Читай http://php.net/manual/ru/function.ob-start.php

Буферы вывода помещаются в стек, то есть допускается вызов ob_start() после вызова другой активной ob_start(). При этом необходимо вызывать ob_end_flush() соответствующее количество раз.

Попробй несколько раз вызвать ob_end_flush() — раз 5 для верности :)

Илон Маск рекомендует:  Что такое код getdate

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

Буферизация вывода в php достаточно важная и нужная тема. Допустим в какой-то момент php-скрипт производит вывод информации, но есть вероятность того, что в дальнейшем предстоит использовать функцию header() (Например header(«Loacation: /newaddress»)), которая в свою очередь уже не сработает, потому что вывод уже был. Другими словами можно использовать буферизацию php для того что-бы отложить вывод данных. Так-же можно разгрузить сервер от лишней нагрузки организовав html-кэширование, для этого понадобится записать весь вывод скрипта в файл, тут также должен использоваться механизм буферизации.

При выполнении данного скрипта, ничего не будет выведено на экран ( после инициализации буферизации ob_start() ничего не выводится на экран, до тех пор пока буферизация не будет выключена функцией ob_end_clean() ), потому что все данные были последовательно записаны с начала в переменную $out_data_1, а потом в $out_data_2.

Что-бы очистить буфер, используется функция ob_clean();

ob_end_flush

(PHP 4, PHP 5, PHP 7)

ob_end_flush — Сброс (отправка) буфера вывода и отключение буферизации вывода

Описание

Эта функция отправит содержимое буфера вывода (если оно имеется) и отключит эту буферизацию вывода. Если вы хотите использовать содержимое буфера, то вам необходимо вызвать ob_get_contents() перед ob_end_flush() , т.к. все содержимое буфера удаляется при вызове ob_end_flush() .

Замечание: Эта функция аналогична ob_get_flush() , за исключением того, что ob_get_flush() возвращает содержимое буфера в виде строки.

Возвращаемые значения

Возвращает TRUE в случае успешного завершения или FALSE в случае возникновения ошибки. Основной причиной неудачного завершения работы функции является ее вызов без активной буферизации или если буфер не может быть удален (специальный тип буфера).

Ошибки

Если функция завершается ошибкой генерируется E_NOTICE .

Примеры

Пример #1 Пример использования функции ob_end_flush()

Следующий пример показывает простой способ сброса и завершения всех буферов вывода:

Смотрите также

  • ob_start() — Включение буферизации вывода
  • ob_get_contents() — Возвращает содержимое буфера вывода
  • ob_get_flush() — Сброс буфера вывода, возвращая его содержимое и отключение буферизации вывода
  • ob_flush() — Сброс (отправка) буфера вывода
  • ob_end_clean() — Очищает (стирает) буфер вывода и отключает буферизацию вывода

Ob_end_flush — очищает (отправляет) буфер вывода и отключает буферизацию вывода.

ob_end_flush — очищает (отправляет) буфер вывода и отключает буферизацию вывода.

Описание

void ob_end_flush (void)

Эта функция отправляет содержимое буфера вывода (если оно имеется) и выключает буферизацию вывода. Если вы хотите в дальнейшем обработать содержимое буфера, вы должны вызвать ob_get_contents() до ob_end_flush() , так как содержимое буфера выбрасывается после вызова ob_end_flush() .

PHP буфер ob_flush () против flush ()

В чем разница между ob_flush() а также flush() и почему я должен звонить обоим?

Эта функция отправит содержимое буфера вывода (если есть).

Сбрасывает буферы записи PHP и все, что использует внутренний сервер PHP (CGI, веб-сервер и т. Д.).

Тем не менее, он продолжает говорить:

[он] может не иметь возможности переопределить схему буферизации вашего веб-сервера …

Итак, мне кажется, что я мог бы просто использовать ob_flush() Все время. Тем не менее, я получаю странные результаты, когда я делаю это. Может ли кто-нибудь объяснить простыми словами, что здесь происходит?

Решение

ob_flush отправляет инициированный приложением буфер. Может быть несколько вложенных ob_start() в любом скрипте PHP. ob_flush передает текущий контент на верхний слой.

Сам PHP может (по своему усмотрению) буферизовать вывод. Это зависит от серверной части. Но обычно FastCGI имеет буфер сокетов самостоятельно. Следовательно flush() Необходимо также вызвать для отправки текущего содержимого на веб-сервер.

И теперь веб-сервер может сам реализовать другую схему буферизации ( mod_deflate или контент-фильтр), на который вы не имеете никакого влияния. Но это редко, так как его нужно специально настраивать.

Во всяком случае, используйте оба.

Другие решения

ob_flush очищает выходные буферы вы созданный с помощью функции, как ob_start

flush сбрасывает буферизованный вывод самого скрипта PHP его вызывающей стороне

ob_flush() флеш высокого уровня. Он очищает высокоуровневые буферы и помещает весь контент в низкоуровневые внутренние буферы, готовые к отправке.

  • Обратите внимание, что ob_ семейство функций создать стеки буферов, так что просто слепо писать ob_flush() везде действительно будет давать «странные результаты», если код был написан, чтобы воспользоваться преимуществами этого стекирования.

flush() это низкоуровневая очистка, указывающая PHP очищать свои внутренние низкоуровневые буферы данных.

Ниже этого все еще будут буферы уровня сокета; ниже этого есть буферы сетевого уровня. И, на самом низком уровне, очередь электронов, идущая по кабелю данных.

Я думаю, это связано с вашим предыдущий вопрос . Существенное преимущество использования буферизации вывода заключается в том, что она используется вместе со сжатием данных. Если вы не используете ob_gzhandler , мало что можно получить. flush один будет просто фиксировать любые выходные данные на сервере. С ob_start и его аналоги ob_flush , ob_end_clean а также ob_end_flush все, что ждет, чтобы быть сжатым (посмотрите на flush а также ob_flush что касается разных ведер — ob отправляет данные в flush , flush отправляет данные в браузер — может быть неточным, но это идея), будет завернут и отправлен клиенту.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL