проблемма с flush()

sivka

Новичок
Добрый день. Скрипт ниже нормально работает на локалке и не работает на хосте, проверял на трёх разных хостингах (apach).
//ini_set('zlib.output_compression', 'Off');
// @ini_set('output_buffering', 'Off');
// @ini_set('output_handler', '');
//ob_implicit_flush(true);

$i = 0;
$c = $i + 4;
while (++$i < $c) {
echo $i . "\n\n";
ob_flush();
flush();
sleep(2);
}


На локалке он как положено выводит в браузер по одной цифре раз в две секунды. Но это только на локале. То есть буфер не сбрасывается. Есть подозрение, что проблема кроется в gzip/deflate, судя по заголовкам и по слухам gzip сам буферизирует вывод. Попытка отключить через php и htaccess (SetEnv no-gzip dont-vary) не работает. Кто-нибудь сталкивался с такой штукой?
 

fixxxer

К.О.
Партнер клуба
скорее всего, на хостинге в качестве фронтенд-веб-сервера установлен nginx, у которого свой собственный буфер
 

Luge

Нестандартное звание
у браузеров тоже есть свой буффер для накопления и вывода информации. У большинства сейчас 4kiB (4096 байт). Посмотри пример в мануале. Там вместе с каждой строкой выводят
PHP:
str_pad('', 4096)
Как-то так
PHP:
if (ob_get_level() == 0) {
    ob_start();
}

$i = 0;
$c = $i + 4;
while (++$i < $c) {
    echo $i . "\n\n";
    echo str_pad('', 4096) . "\n";
    ob_flush();
    flush();
    sleep(2);
}
ob_end_flush();
Ну, или кто-то ещё по дороге кэширует
 

sivka

Новичок
точно не браузер. Вставлял echo ":" . str_repeat("_ ",500000) . "\n"; бестолку. По поводу ngnix. Тестировал в частности на хосте 1gb - у них ngnix не упоминается. Опять таки, почему браузер на локалке не буферит, а на хосте буферит. Он что отличает локальный хост от виртуального
 
Последнее редактирование:

Luge

Нестандартное звание
очень долго можно гадать. Начиная с того что output_buffering нельзя переназначить в ini_set(), продолжая каким-нибудь SendBufferSize в конфиге апача и заканчивая BufferSize из mod_buffer
А некоторые хостеры любят LiteSpeed за апач выдавать. И там тоже бывают свои весёлости…

Так что сравните в чём разница в настройках сервера и локальной машины, самый простой вариант, имхо
 

CoolKid

Новичок
Код:
<? phpinfo(); ?>
В локале и на сервере и сравнить результат

Да и ещё...попробуй в самом начале скрипта сделать
Код:
if (ob_level()) {
    ob_end_clean();
}
 

Активист

Активист
Команда форума
Проблема в модуле gzip / deflate. Отключить его нужно ( через .htaccess )

SetEnv no-gzip 1
 
Сверху