Как заставить скрипт выводить данные ПО ХОДУ выполнения, а не в конце?

Greendrake

Новичок
Как заставить скрипт выводить данные ПО ХОДУ выполнения, а не в конце?

Есть долгоработающий скрипт (ну, там, скажем, парсинг текстовых файлов на несколько гигов). Нужно, чтобы он посылал в браузер данные о ходе выполнения задачи ПО ХОДУ её выполнения, а не в конце. А то чаще всего он долго делает своё дело, а в конце только выводит весь отчет... Может, есть какой приём, заставляющий не дожидаться конца выполнения, а посылать инфу в браузер по ходу??
 

Фанат

oncle terrible
Команда форума
ЧЕГО-ЧЕГО???

-~{}~ 18.08.05 18:38:

кстати, да.
если данные - это таблица, то её надо разбить на много мелких
 

Guest111

Guest
Фанат
на много мелких чего? таблиц?
вот это я слышу впервые ща пойду пробовать...
можь я че не так понял конечно...
 

Greendrake

Новичок
Нашёл, что очень многим помогает комбинация

flush();
ob_flush();

но не мне.

Вот скриптик
PHP:
$exe_time=600;
error_reporting(4);
for($i=0;$i<$exe_time/2;$i++)
{
  sleep(2);
  print ((($i+1)*2)."<br>");
  flush();
  ob_flush();
};
Вот как он работает:

http://greendrake.info/timer.php

Почему-то выводить начинает только на 88 отсчёте (172 секунды), но почему не сразу???? :confused:
 

Kelkos

Сам себе программер
Почему-то выводить начинает только на 88 отсчёте (172 секунды), но почему не сразу???? :confused:
Это бага ИА. Почитай мануал о ob_flush ..
------------
Сорри.. в мануале чё то уже не нашёл. А ведь читал описание этой глюки.
Вообщем, бороться с этим можно добавляя к выводимым символам строку из пробелов (что то около 30 пробелов)..
Хотя у меня flush работал и безовсякого. (правда перед флюшем было 1 кб. хтмла.. может из-за этого?)
 

ksnk

прохожий
А вот если убрать ob_flash, то в Denver'е все работает существенно лучше...
 

Romantik

TeaM PHPClub
Фанат
нет, не на много таблиц
я как-то делал подобное- работает!
идея такова:
<table style="table-layout:fixed" width="100%" cellspacing="1" cellpadding="1" border="1">
<col width=20%>
<col width=30%>
<col width=10%>
<col width=10%>
ну и потом в цикле задачи:
<tr>
<td>...</td>
<td>...</td>
<td>...</td>
<td>...</td>
</tr>
 

vovanium

Новичок
Почему-то выводить начинает только на 88 отсчёте (172 секунды), но почему не сразу????
IE, насколько я помню, начинает показывать страницу после получения первых 512 байт.
 

phobos

Новичок
Фанат наверное имел введу что некоторые браузеры например не будут отображать данные пока не получат </table> текущей таблицы.
т.е. если у тебя в начале открыта таблица а закрыта после выполнения скрипта то браузер даже получив текст по частям не будет его отображать.

з.ы. в мане всё есть...
 

sal

Новичок
Greendrake
Почему-то выводить начинает только на 88 отсчёте (172 секунды), но почему не сразу????
Сейчас проверил на firefox-e работает сразу (т.е. ждать не надо) на IE пришлось подождать. Так что грабли не в коде, это точно!
 
flush(), кстати, не везде работает. На Зеноне, например, он вообще не вызывает никакого действия. Медицинский факт.
 

Greendrake

Новичок
Сейчас проверил на firefox-e работает сразу (т.е. ждать не надо) на IE пришлось подождать. Так что грабли не в коде, это точно!
Мда, действительно! В Мозилле тоже нормуль. Всем спасибо.
 

MiRacLe

просто Чудо
Код:
#cat ./.htaccess
php_value output_buffering 0
php_value implicit_flush 1
А не "везде" просто потому что, есть "кеширующие-акселерирующие" прокси......
 
Сверху