2012-03-15 1 views
5

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

Я прочитал 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); 
} 
?> 

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

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

+0

Можете ли вы подтвердить, что вывод по-прежнему буферизуется, а браузер просто ничего не отображает (например, IE ничего не отобразит, пока не получит некоторое количество байтов)? –

+0

выполняет эту функцию http://php.net/manual/en/function.ob-get-level.php return 0? – dqhendricks

+0

вы можете попробовать это, если это поможет http://in3.php.net/manual/en/function.ob-end-flush.php –

ответ

4

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

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

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

+0

Ну, я собирался сказать, что раньше отправлял справедливый бит данных, но при изменении его на ($ i = 0; $ i <10000; $ i ++) {echo 'x
'; sleep (1) }, он выводится просто отлично. Я предполагаю, что единственным обходным решением будет отправка большего количества данных, чтобы заставить браузер отображать его. Не может быть идеальным. Спасибо хоть. Я продолжал просматривать свои сценарии и конфиги, и это сводило меня с ума. – Apropos

+0

IE известен этим. Я обманул IE, отправив около 1000 пробелов перед промывкой. Поскольку HTML скомпонован в пространствах, это не имеет значения. – nalply

4

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

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

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

+0

Да, это работает. К сожалению, это только потому, что он отправляет гораздо больше данных, чем я хотел отправить. Изменение времени между итерациями до 1 с вместо .001 приводит к возврату нежелательного поведения. – Apropos

+0

Это делает мой день. Я думаю, что это работает из-за использования ob_flush(); вместо флеша(); – Alrik

+0

Это из-за количества отправленных данных, а не ob_flush(). Исходный пример невозможен даже при добавлении ob_flush(), иначе это не удастся при изменении времени между итерациями на 1 с вместо тысячной секунды, как это сейчас. – Apropos