ob_implicit_flush issue

das6745

Новичок
ob_implicit_flush issue

Доброго времени суток, я делаю свой небольшой движок(opensource), и вот дело дошло до контроля выводимых данных.

Задача такая: проверить какие Content-Encoding понимает браузер и в соответствии пережимать выводимые данные и отправлять их юзеру после _каждого_ принта или эха, а не в конце выполнения скрипта (чтоб буфер меньше тянул). Вообще сначала я сделал вывод в переменнцую всего содержимого, потом своей функцией жал и отдавал (глупо и неэкономно к ресурсам).

я начал использовать ф-цию ob_start со своим хендлом + ob_implicit_flush. Но почемуто
ob_implicit_flush не флашит данные после каждого вывода. Ман ничего по этому поводу неговорит. Гугл тоже, читал еще www.php.net/manual/en/function.flush.php

...flush() has no effect on the buffering scheme of your web server or the browser on the client side. Thus you need to call both ob_flush() and flush() to flush the output buffers....
но помоему это не мой случай.

Вот маленький пример на которм я тестирую:

PHP:
<?php
function test($str) {
    return 'test: '.$str."<br/>";
}
ob_start('test');
ob_implicit_flush(TRUE);
echo '1';
echo '2';
ob_end_flush
?>
дает:
test: 12<br/>

ожидалось:
test: 1<br/>test: 2<br/>

Как сделать чтоб хендл дергался после каждого вывода, или может кто посоветует более элегантное решение?

p.s:
и это все на Apache/2.2.3 (Ubuntu) PHP/5.2.1 mod_ssl/2.2.3 OpenSSL/0.9.8c
 

dimagolov

Новичок
вот в каментах к ману по ob_implicit_flush вычитал:
mhumphrey at _spammenot_designvision dot com
18-Aug-2003 02:41
From experimenting, it looks like using sessions with session.use_trans_sid=1 will force your output to be buffered regardless of this setting.

My guess is that this is so PHP can hunt for URLs in your output to automatically add the Session ID to them. It must wait until script output is complete before it starts that replacement, rather than doing it "on the fly".

When i comment out my session_start() line, i get continuous output to the browser. Put it back in, and i only see the page when it's completely loaded. Change session.use_trans_sid = 0 and i get continuous output again.
 

das6745

Новичок
ИМХО, это совершенно не то, в примере у меня сессиями и не пахнет.
 

Wicked

Новичок
в примере может и не пахнет, а в настройках пхп вполне может быть. Если у тебя session.auto_start = 1, например.

...flush() has no effect on the buffering scheme of your web server or the browser on the client side. Thus you need to call both ob_flush() and flush() to flush the output buffers....

но помоему это не мой случай.
Если после echo 1; вставить ob_flush(), то все будет, как ты хотел.
 

das6745

Новичок
нет, к сожалению у меня ни в скрипте ни в .htaccess не установлена session.auto_startm a в php.ini = 0.

Если после echo 1; вставить ob_flush(), то все будет, как ты хотел.
в том то и дело! в мане говорится что если вызвать ob_implicit_flush без параметров или с чем-нить кроме нула или фолса то флаша ненадо делать.

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

ЗЫ: http://freshcode.org/test.php - скрипт в работе,
https://dallas.hvosting.kiev.ua/ - настройки хоста
 

das6745

Новичок
сорри. я идиот. полный. Спасибо что открыли глаза, flush и ob_flush это ведь разные вещи. проблема решена, ob_implicit_flush не избавляет от необходимости приминения ob_flush, только от flush, иначе ф-ция не имееи смысла.

ps: хотя у меня работает и без flush при отключенном ob_implicit_flush, в ини файле флаш тоже отключен.

-~{}~ 23.10.07 00:45:

pps: но увлекаться ob_implicit_flush не стоит, у меня время выполнения скрипта поднялось на 40% (правда я очень дико увлекся ob_implicit_flush =))
 
Сверху