Как сделать индикатор процесса выполнения php-скрипта?

12
Yurecm
На сайте с 25.02.2007
Offline
233
12134

К примеру есть скрипт


for($j=0;$j<100;$j++)
{
funcia($j);
echo $j;
}

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

Или допустим что бы как в сапе диаграмка появлялась)

Заранее спасибо плюсом :beer:

neznaika
На сайте с 28.06.2006
Offline
356
#1
Дорого покупаю настоящие сайты. Не инвестирую деньги и не беру кредиты.
Brand from Amber
На сайте с 18.08.2007
Offline
293
#2

Насколько я понял - Вам требуется что-то подобного плана?

К сожалению PHP не знаю, но подозреваю, что и в Вашем случае стоит смотреть в сторону отключения буферизации и, возможно, сюда.

Лучший способ понять что-то самому - объяснить это другому.
Ghost Bear
На сайте с 01.07.2009
Offline
28
#3

С таким приходилось сталкиваться во время работы с трансляциями, когда нужно было безостановочно отдавать видеоданные, а сервер сначала их генерировал, а потом высылал всем скопом. Во-вторых веб-сервер сначала создает документ, а лишь потом отдает его - все "тормоза", которые вы видите при загрузке страницы это лишь тормоза на уровне передачи документа, а не его создания. Так же не стоит забывать, что некоторые браузеры не начинают "рисовать картинку" сразу, после получения ответа, а дожидаются, когда придет вся страница, и лишь после некоторого ожидания, когда видят что ответ задерживается, начинают дорисовывать то, что хотя бы успело загрузится.

Примерно так: [создание]--передача->[браузер] - пока не завершится один пункт, не наступит другой - то есть браузер не увидит процесс создания, потому что сервер, пока не создаст страницу до конца, ее не начнет передавать. (поэксперементируйте со sleep - вы ведь как бы останавливаете выполнение, а сервер не торопится выслать то, что уже получилось на тот момент) Кстати, есть функция headers_sent, которая определяет отправлены были ли заголовки, так вот, насколько я знаю, отправлены они не пользователю в браузер, а в итоговый ответ, который "находится" на стадии генерации, и который уже после окончания процесса выполнения уйдет к юзеру.

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

Пишу, основываясь лишь на личном опыте, так как пободный вопрос тоже поднимался :)

Пишу продвинутый веб-софт и автоматизирую сео-задачи на партнёрских условиях. Ваша тема + Мой код = Совместный успех. Велком в ЛС.
[Удален]
#4

Yurecm Юра )) ты вроде не первый год уже занимаешься программированием )) на php это ни сделать ни как )) нужно применять ajax в цикле отправляя и получая данные. Как пример отправки данных можешь глянуть тут, не то что нужно но смысл один.

http://yandex.ru/yandsearch?text=JsHttpRequest&yasoft=barff юзай его, очень всё просто, и без заморочек ))

elkini
На сайте с 03.07.2009
Offline
119
#5

Нужно заставлять скрипт выбрасывать весь накопленный буфер в браузер.


ob_start();

for($j=0;$j<100;$j++)
{
funcia($j);

echo str_repeat(" ", 50);
echo $j;
ob_flush();
flush();

}

Или аяксом. Рассказать как?

Gmp
На сайте с 12.10.2008
Offline
83
Gmp
#6
elkini:
Нужно заставлять скрипт выбрасывать весь накопленный буфер в браузер.

echo str_repeat(" ", 50);

не для каждого браузера 50 символов хватит чтоб он отобразил это сразу, проверено, может понадобиться и 500 ;)

elkini
На сайте с 03.07.2009
Offline
119
#7
Gmp:
не для каждого браузера 50 символов хватит чтоб он отобразил это сразу, проверено, может понадобиться и 500

Да, я поленился написать, что эту цифру надо крутить до достижения эффекта :) У меня она пляшет от 10000 до 15000, код выше из последнего проекта, в котором всё ок с 50

[Удален]
#8
KosoyRoman:
Yurecm Юра )) ты вроде не первый год уже занимаешься программированием )) на php это ни сделать ни как )) нужно применять ajax в цикле отправляя и получая данные.http://yandex.ru/yandsearch?text=JsHttpRequest&yasoft=barff юзай его, очень всё просто, и без заморочек ))

Ну ты не совсем прав. Я уже в одном топике показывал.


ob_start();

$time=microtime(true);

$step=0;
$length=6.0; // .
while (($dif=microtime(true)-$time)<$length)
{

if (($step_=floor(microtime(true)*15))>$step) // 15
{
$step=$step_;
echo ":",round($dif/$length*100);
ob_flush();
flush();
}


}

ob_end_clean();

ob_* можно пожалуй даже убрать

awcms.ru/yu/test.html - тут можно посмотреть.

Yurecm:
К примеру есть скрипт

for($j=0;$j<100;$j++)
{
funcia($j);
echo $j;
}

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

Заранее спасибо плюсом 🍻

flush() - ключ к успеху.

elkini
На сайте с 03.07.2009
Offline
119
#9
neolord:
flush() - ключ к успеху.

Именно что нет. ob_ - ключ к успеху, в комбинации с flush()

Использование только flush() не гарантирует хороший результат.

dvaes
На сайте с 03.09.2007
Offline
65
#10

не забываем, что есть еще ob_implicit_flush. но в зависимости от ситуации конечно. чаще все таки надо использовать ajax или фрейм обновляющийся...

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий