Ob implicit flush не работает

php flush не работает

У меня есть выделенный сервер, поэтому я могу внести изменения. Я использую apache и nginx в качестве прокси-сервера.

12 ответов

Вы используете ob_flush без ob_start , поэтому для него нечего скрывать.

Это также зависит от веб-сервера и прокси-сервера и его настроек.

Вы должны отключить буферизацию для Nginx (добавьте «proxy_buffering off;» в файл конфигурации и перезапустите Nginx)

Кроме того, проверьте, содержит ли ваш php.ini «output_buffering = Off» и «zlib.output_compression = Off».

Итак, что я узнал:

Флеш не будет работать под Apache mod_gzip или Nginx gzip, потому что он логически является gzipping содержимым, и для этого он должен буферизовать содержимое для его gzip. Любой вид gzipping веб-сервера повлияет на это. Короче говоря, на стороне сервера нам нужно отключить gzip и уменьшить размер буфера fastcgi. Итак:

Также есть эти строки под рукой, особенно если у вас нет доступа к php.ini:

@ini_set ( ‘zlib.output_compression’, 0);

@ini_set ( ‘implicit_flush’, 1);

Наконец, если у вас есть это, выполните приведенный ниже код:

PHP-код:

Основной файл php;

Просто хотел добавить к ответу Роджера.

Если вы используете модуль FastCGI php5-fpm внутри Apache2, вы также должны убедиться, что добавляете

-flush

в вашей конфигурации Apache2, т.е.

Вы должны заполнить буфер, чтобы его можно было сбросить в браузер. Используйте это после эха

Другая возможная причина — mod_security. Похоже, у него есть собственные буферы. Поэтому, если вы используете его, вам нужно будет установить:

Вид грязного обходного пути, но пока что это единственный способ заставить его работать.

Проверьте свой сервер api с помощью

Если вы нашли свой сервер api

в CentOS, затем добавьте эту строку в «/etc/httpd/conf.d/fcgid.conf»

Чтобы протестировать, перезапустите сервер Apache и попробуйте выполнить код ниже

Мне удалось выполнить только этот способ: добавление session_write_close();

Я заметил, что браузеры реагируют по-разному. Например, Chrome хранится на входе навсегда и, похоже, не заботится о его отображении ранее. Неудивительно, что Firefox будет отображать ввод раньше, если применяются приведенные выше советы (внесенные другими stackoverflowers), поэтому попробуйте с Firefox.

output_buffering = Выкл. zlib.output_compression = Выкл.

fastcgi_keep_conn on; # Rodrigo Gregorio 26 янв. 2013, в 19:27

Как я читал, кажется, что очень трудный pb для решения, и единственный (грязный) способ, который я нашел, пишет что-то бесполезное для вывода, чтобы заполнить буферы. — без ssl — без output_buffering, необходим флеш, буферы nginx можно опустить до тех пор, пока размер заголовка php — с output_buffering, ob_flush необходимо добавить, чтобы иметь такое же поведение, как и выше — с ssl существует еще один буфер для ssl и NGX_SSL_BUFSIZE фиксирован в компиляции nginx

Вот мой файл test.php(вызовите его с? size =. чтобы изменить запись пространства в цикле)

И нижний conf, который я могу установить, — это

Источник

ob_implicit_flush

(PHP 4, PHP 5, PHP 7, PHP 8)

ob_implicit_flush — Включение/выключение неявного сброса

Описание

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

Список параметров

1 для включения неявного сброса, false в противном случае.

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

Функция не возвращает значения после выполнения.

Список изменений

Версия Описание
8.0.0 flag теперь принимает логическое значение ( bool ); ранее принималось целое число ( int ).

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

  • flush() — Сброс системного буфера вывода
  • ob_start() — Включение буферизации вывода
  • ob_end_flush() — Сбросить (отправить) буфер вывод и отключить буферизацию вывода

User Contributed Notes 6 notes

Note that the name ob_implicit_flush is misleading. Despite its name, this function does NOT work with the user output buffer, i.e. the one that the rest of the ob_* functions work with. It will NOT do an automatic ob_flush(). It will do an automatic flush(). Different things.

For example, the following script:

();
for( $i = 0 ; $i 10 ; $i ++)
<
echo » $i \n» ;
sleep ( 1 );
>
?>

will be equivalent to this one:

for ( $i = 0 ; $i 10 ; $i ++)
<
echo » $i \n» ;
flush ();
sleep ( 1 );
>
?>

That script will not output anything until the end, if ‘output_buffering’ is set to ‘on’ in php.ini. Unfortunately, there is no way to do an implicit ob_flush() after each output, that I am aware of.

If you want the output to come out as it is generated, one solution is to *also* add ob_end_clean() or ob_end_flush() to the beginning of the script:

();
ob_implicit_flush ();
for ( $i = 0 ; $i 10 ; $i ++)
<
echo » $i \n» ;
sleep ( 1 );
>
?>

This will output as it goes. This is only a problem if you only want one part of the output to come out in real time, and want the rest buffered. In that case, since there’s no function to do an implicit ob_flush() every time, you need to call it explicitly. For example, this works:

(); // not needed if output_buffering is on in php.ini
ob_implicit_flush (); // implicitly calls flush() after every ob_flush()

echo «This output is buffered.\n» ;
echo «As is this.\n» ;

Источник

Вызов ob_flush () и flush (), но браузер не показывает вывод, пока скрипт не завершится

Привет Пожалуйста, смотрите ниже код:

Это неправильно? я проверил это, но мое выходное шоу, когда сценарий готов, есть какое-либо решение?

12 ответов

Эй, чувак, я тоже застрял в этой проблеме и, наконец, получил правильное решение вот оно для тебя

вы должны добавить тип контента для своей страницы Вы можете сделать это двумя способами 1. используя HTML-тег

используя функцию заголовка php

Некоторым браузерам необходимо получить не менее 256 символов, прежде чем они начнут отображаться. Вы уже пытались набить больше вывода, например:

РЕДАКТИРОВАТЬ :

В разделе Apache/2.2.11 (Win32) DAV/2 mod_ssl/2.2.11 OpenSSL/0.9.8i PHP/5.2.9 мне удалось воспроизвести проблему OP, установив

Отключить его снова

заставил скрипт работать так, как хотел.

Попробуйте удалить вызов ob_start() в первой строке: вам не нужно включать буферизацию вывода — и это, вероятно, вызывает проблемы, здесь.

Я проверил ваш код:

  • Если ob_start() вызывается в первой строке, вывод я вижу только после завершения скрипта через 10 секунд
  • Если я удалю этот вызов ob_start() , то каждую секунду я вижу одну строку вывода, как только она отображается на стандартный вывод.

Используя Chrome, я обнаружил, что для обхода буфера браузера требуется гораздо больше байтов. В моем случае 4096 байт было хорошо:

Кроме того, добавление некоторого HTML-элемента в начале также представляется обязательным:

В моей системе кажется, что FF4 нужно более 256 байтов, чтобы начать рендеринг того, что поступает со стороны сервера, затем я решил это с самого начала:

Я обнаружил, что это произошло из-за того, что в моем случае используется сжатие Apache gzip.

Чтобы отключить gzip только для скрипта очистки, я создал новый файл .htaccess в каталоге, где находится скрипт непрерывного вывода находится со следующим:

Промывка снова работает, как и ожидалось.

Для людей, использующих FCGI /fast cgi.

Это правильно. У меня отлично работает из CLI под управлением PHP 5.3.3. Если это не работает для вас, в вашей установке PHP может быть отключена буферизация вывода.

Я бы также предложил добавить ob_end_flush () в конце вашего скрипта, чтобы закрыть буфер вывода.

Одна хитрая проблема с IE8 и flush (); в том, что если вы «очищаете» строки в таблице. IE будет отображать таблицы только после их завершения. Это была моя проблема, и замена контейнеров из строк таблицы на divs решила эту проблему.

Вам нужно добавить файл .htaccess , чтобы отключить вывод gzip

Я использую фреймворк Laravel и буферизация не работает, но Это решение:

Вы должны использовать сначала ob_end_flush ();

Источник

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

Столкнулся с проблемой, которая не дает мне покоя, уже не первый раз. Но вот пришло время её решить.

Не работает flush(); на хостинге заказчика.

Тестовый пример:

Есть доступ к конфигурации php.ini

PHP работает как модуль Апача.

Работающие модули ISP Manager

PHP Info:

Пошел я в гугл, долго искал, читал и пробовал.. Ничего не помогает.. Я грешил на какую-то буферизирующую софтинку, и решил в очередной раз проверить, не загоняет ли сервак свои ответы в gzip, т.к. это обозначало бы что они кешируются.. И вот что я увидел

Кеширования нет, но .. Server: nginx
Вот оно что, в качестве фронтенда, стоял nginx, и я заподозрил именно его в таком поведении.

Нашел конфиг, он находился в /etc/nginx/nginx.conf, посмотрел там, и нашел вот это:

С конфигурацией nginx я столкнулся впервые, знал лишь то, что разработал его Игорь Сысоев и он русский, а это значит, что должно быть достаточно мануалов. Пошел в поиск и попал к нему на сайт, там меня интересовал раздел документации, а именно модуль ngx_http_proxy_module. Вот там я и нашел ответ на свой вопрос, а именно директиву proxy_buffering:

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

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

Пошел искать эту директиву в своем конфиге, но её там небыло. Ну, раз нет, тогда добавим и я её прописал в секции Main location:

(!) Не забудьте про точку запятую в конце. Я забыл, и в начале подумал, что это лекарство мне не помогло.

Конфигурация, сохранена. Остается вопрос, как же рестартануть nginx с правильной конфигурацией. Это делается таким образом (в консоли):
1) #ps ax | grep nginx
2) ищем в выданном нам списке nginx: master process
3) запоминаем его pid (это число в начале строки), пусть это будет 7889
4) #top
5) теперь нажимаем k
6) На вопрос PID to kill отвечаем, номером нашего процесса, т.е. 7889, нажимаем Enter
7) На вопрос Kill PID 7889 with signal [15]: отвечаем HUP, нажимаем Enter (подробнее про сигналы тут)
8) нажимаем Ctrl+C для выхода из top’a
9) Можно тестировать наш скрипт с flush

У меня все заработало и я был счастлив! Как всегда, проблема которую не можешь решить несколько дней, решается всего одной маленькой строчкой 🙂

Похожие статьи

Автор: Виталий Орлов | Рейтинг: 4 / 5 | Теги:

10 комментариев

Да, на Денвере работает. А, например, в windows server 2012 стоит IIS8 и размер буфера по умолчанию 4МБ. Его, конечно, можно заполнить подобным образом через echo str_pad(‘ ‘, 4294967296); , но в этом случае вывод текста происходит только первый раз, а всё остальное только в конце скрипта. Причём даже если поставить str_pad в цикл. Да и гонять постоянно 4МБ тоже нагрузка.
В настройках IIS8 буферизация вывода так запросто не отключается. Буферизацию в IIS8 можно выключить или уменьшить, если поправить файл
C:\Windows\System32\inetsrv\config\schema\IIS_schema.xls.
Но у админа нет прав на его запись, и даже при остановленном IIS система показывает access denied. И в свойствах файла права не устанавливаются.
Доступ можно открыть, выполнив следующий батник

SET DIRECTORY_NAME=»C:\Windows\System32\inetsrv\config\schema»
TAKEOWN /f %DIRECTORY_NAME% /r /d y
ICACLS %DIRECTORY_NAME% /grant administrators:F /t
PAUSE

В самом файле IIS_schema.xls значение «bufferingOn» ставим false. Значения «bufferingLimit», «responseBufferLimit», «receiveBufferLimit» по умолчанию установлены 4194304. Меняем на 4096. Если ещё меньше, то IIS не запускается, тип Integer у него предполагает значение от 4096, о чём он и сообщает при попытке запуска.

После этих исправлений в файле IIS_schema.xls, наконец, пошёл динамический вывод текста на php 5.6 на IIS8. Этим самым способом, когда один раз выполняем

echo str_pad(‘ ‘, 1024);
@ob_flush();
flush();

А потом просто flush();

У меня flush(); заработал вот так:

Автору респект!
Мне тоже довелось убить целый день для решения этого вопроса.
Добавлю, что отключить буферизацию Nginx можно также прямо из php-скрипта, посредством заголовка X-Accel-Buffering.
А вот с буферами Apache все не так гладко. Мне пришлось добавить
while (ob_get_level()) < ob_end_flush(); >
—без этого не работало.
Кроме того, отключить zlib через ini_set удается не на всех серверах.

Вот наиболее универсальный вариант:

Ты невнимательно прочитал статью, там никто процесс не убивает и даже не рестартует. Ему только посылается команда HUP для «обновления конфигурации». Об этом подробнее написано в мануале на сайте nginx — Управление nginx:

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

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

познаём новое:
/etc/init.d/nginx restart (server Debian based)
/etc/init.d/php-fpm restart (после изменений php.ini, имя процесса пхп у Вас может быть и другим)

Пишу для новичков, чтобы учились всё правильно делать..)) Удачи)

Источник

Читайте также:  Не могу настроить монитор по ширине
Оцените статью