Отключение буферизации вывода в PHP - PullRequest
5 голосов
/ 16 марта 2012

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

Я прочитал http://www.php.net/flush и перепробовал все предложения там,Очевидно, я пытался отключить output_buffering в php.ini.Я отключил deflate_module, сжатие zlib отключено, нет mod_gzip.Вызов flush () или ob_flush () не имеет никакого эффекта, равно как и включение implicit_flush.

Я просто запускаю XAMPP (в настоящее время apache 2.2.17, php 5.3.4) под Windows Server 2008 R2.PHP запускается как модуль.

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

Из аналогичной темы кто-то предложил посмотреть, что будет делать следующее:

<?php
while (TRUE)
{
    echo 'x';
    flush();
    sleep(1);
}
?>

Как и ожидалось, на странице ничего не отображается до максимального времени выполнениядостигается, в этот момент он очищает буфер.

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

Ответы [ 2 ]

4 голосов
/ 16 марта 2012

хммм, интересно схватил фрагмент кода, который я использовал где-то еще, и он работает, как и ожидалось ...

https://stackoverflow.com/a/9728519/632951

<?php
echo str_repeat('fillerbytes',20*1024/strlen('fillerbytes'));
echo '<body style="font-size:6px;font-family:arial;">';
echo str_repeat('<br>',2);
    for($i=1; $i<=5000; $i++){
        echo $i . ' ';
        ob_flush();
        flush();
        usleep(2000); // 2 ms each = 10s total
    }
?>

Наблюдайте, как подсчитывается мой сервер до 5000 http://atwebresults.com/texttest/new.php

(Didsне работают на некоторых бесплатных хостах, таких как freehostingeu.com.)

4 голосов
/ 16 марта 2012

Вы отправляете только небольшое количество данных. Браузеры имеют свой собственный буфер, который может быть основан на количестве байтов, полученными элементами или чем-то еще.

Короче говоря, с этим ничего нельзя поделать. Буферизация происходит на стороне клиента, а не на стороне сервера. Вы можете попробовать отправить больше данных до того, как x s.

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

...