возможен ли индикатор выполнения с php и javascript с помощью ajax

мне было интересно, как сделать индикатор прогресса, как gmail.

пробовал

<script src="jquery.js"></script>
<script>
$(function (){
    $.ajax({
        url: 'index.php',
        success: function(data) {
            $('#bar').html(data);
        }
    });
})
</script>
<div id="bar"></div>

и index.php

[EDIT]: by sleep() Я просто хотел смоделировать непрерывный поток вывода, Как многопоточные программы, которые не поддерживаются в php.

<?php

for($i=0; $i<=10; $i++)
{
    sleep(1);
    echo "$i";
}

кажется, что выход эхом сразу, поэтому я получаю результат 012345678910 сразу.

также я пробовал

setInterval(function (){
        $.ajax({
            url: 'index.php',
            success: function(data) {
                $('#bar').html(data);
            }
        });
    }, 1000);
, Я проблема поддержания значения 'progress', Я так и сделал
<?php

session_start();

if(isset($_SESSION['value'])){
    if($_SESSION['value'] >= 10)
    {
        unset($_SESSION['value']);
    }
    else
    {
        $_SESSION['value']++;
    }
}
else
{
    $_SESSION['value'] = 0;
}

echo $_SESSION['value'];

как часть моего php. Но, похоже, я вызываю функцию ajax на непрерывном интервале.

мой вопрос:

  1. как google использует индикатор выполнения, а loginng в gmail. Они получают непрерывным 'stream' данных, как я пробовал на своем первом примере или отправить (регулярно) запрос на какой-то url (хотя и не через ajax .. через JSONP или что-то еще) и upadate страницу, как второй ?

  2. могу ли я сделать то же самое с php, даже если не с php, могу ли я сделать это с помощью javascript и другого языка сценариев на стороне сервера, где поддерживается многопоточность?

5 ответов


Я не уверен, что именно Gmail делает для progressbar, но вы можете достичь чего-то подобного в PHP, хотя это может быть немного сложно.

во-первых, чтобы объяснить, почему ваши примеры не работают:

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

Если вы используете сеанс, как в другом примере, проблема становится хранилищем сеансов. Хранилище обычно блокируется во время выполнения скрипта, и оно не будет обновляться, чтобы разрешить тип проверки выполнения.

что вы можете сделать, это записать прогресс в файл (или в базу данных) вручную. Например:

file_put_contents('progress.txt', 1);

затем другой скрипт прочитает файл и выведет его содержимое.

Это должно работать, потому что file_put_contents открывает, записывает и закрывает файл.

используя другой язык, чем PHP будет легче. Быть многопоточным, возможно, облегчило бы это, но не является требованием. Однако непрерывный процесс упростит его (PHP запускает процесс только на время вашего запроса, а затем завершает работу)


запустите код jquery с интервалом и используйте PHP для печати проценажа выполнения и рисования панели.

так это будет что-то вроде

<script>
function bar()
{
 var v=getProgress(...);
 setTimeout("bar()",1000);
 drawBar();
}

function drawBar(l)
{
 //set div's length to l
}
</script>

Изменить 2

<?php
/* get the request and calculate the job completion percentage and echo it !  */
?>

Я думаю, что Gmail показывает прогресс, когда он загружает все ресурсы, такие как JS-файлы. Есть разные способы сделать это: вы можете динамически включать все ресурсы с JS, или вы можете сделать все включенные файлы JS сообщить, что они были загружены.


чтобы сделать вывод PHP частичным, используйте следующее:

ob.в PHP

<?php

ob_start();

for ($i = 0; $i < 100; $i++) {
    echo "{$i}<br />";

    ob_flush();
    flush();

    usleep(100000);
}

.реврайт

php_value output_buffering "0"

и этой ссылке помог мне найти решение той же проблемы, поэтому я предоставляю его для записи:


по моему мнению, вы можете разделить процесс входа в систему на несколько частей и проверок.

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