<?php
set_time_limit(0);
for($i = 1; ; $i++)
{
echo "<script>parent.updateProgress($i);</script>";
flush();
sleep(2);
}
?>
Индикатор процессов PHP
Как можно на ПХП реализовать индикатор процесса?
Допустим если цикл перебирает огромный массив данных, чтобы постаянно (допустим каждые 100 шагов) клиенту посылались данные в браузер (например добавлялась точка или другой знак индикации)?
Делаю так:
Код:
$cnt = 0;
while($value=mysql_fetch_array($values_arr))
{
//Какое-либо действие
.............
//
$cnt++;//прибавляю счётчик
if ($cnt >= 100)
{
$cnt = 0;
echo '.';
}
}
while($value=mysql_fetch_array($values_arr))
{
//Какое-либо действие
.............
//
$cnt++;//прибавляю счётчик
if ($cnt >= 100)
{
$cnt = 0;
echo '.';
}
}
Простой пример, но линия из точек отображается или на половине ВСЕГО процесса или вообще по его завершению.
Как зделать, чтобы постоянно, когда $cnt>=100 в клиентском браузере появлялась новая точечька?
Значит, надо в цикле запрашивать цифру $cnt браузером через какое-то время, и в зависимости от неё, например растягивать рисунок gif.
Тоесть мне тут нужно JavaScript+AJAX еще прилепить? Или это через ПХП можно реализовать?
Вообще не понимаю этой затеи. Ты не можешь контролировать процент выполнения. Ну разве что писать в файл этот процент. А уже отдельным процессом читать цифру из этого файла.
Например сейчас я делаю скрипт, который экспортирует с одной БД в другую, с проверкой на наличие, товары. Этот процесс занимает около 5-ти минут, поэтому когда перед пользователем белый экран, он начинает нервничать и думать, что или браузер завис или ещё какие глюки. А так он будет видеть, что процесс идёт. :)
Кстати, за идею с промежуточным временным файлом отдельное спасибо!!!
Я понял, как это можно будет реализовать!
Обычно делается всё просто: ставится флэшевый индикатор (или gif), который крутится просто, показывая, что что-то происходит.
Сделать можно периодическими опросами сервера. А на сервере где-нибудь это значение хранить (в БД/файле/memcache/...)
index.php:
[HTML]<div id="progress">none</div>
<script>
function updateProgress(val)
{
document.getElementById('progress').innerHTML = val.toString();
}
</script>
</body>
<iframe src="job_with_progress.php" style="display:none;"></iframe>[/HTML]
job_with_progress.php:
Код:
Спасибо, попробую так!