获取jQuery post调用的PHP脚本的进度

时间:2014-02-25 18:26:30

标签: php jquery ajax polling

我想定期检查php脚本的状态并在浏览器上显示它。这是用于发布的jQuery。

$(document).ready(function() {
      $("#tempbut").click(function(event){
           $('#loader').show();
           $('#mainarea').hide('fast');

          $.post(
           "template.php",
           {
                guide : $('#guide').val(),
                title : $('#title').val()
           },
            function(data) {
                $('#mainarea').empty();
                $('#loader').fadeOut('slow');
                $('#mainarea').append(data);
                $('#mainarea').show('slow');
             }

          );
      });
   });

在PHP脚本(未发布)中,我回复诸如"构建请求...","发送请求..."等语句。通知用户进度。如果我没有使用jQuery post,我可以在每个echo之后使用flush()和obflush()显示状态。也许是因为回调在输出之前等待脚本完全执行?

有没有办法修改现有的jQuery .post来做到这一点?我看到一些使用.ajax的例子,但没有.post。

如果.ajax是唯一的方法,我将如何修改此代码?

谢谢!

修改 跑了!希望有人会觉得这很有帮助。 (您可以删除console.log)

的test.html

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8" />
    <title>TEST</title>
    <meta http-equiv="X-UA-Compatible" content="IE=edge;chrome=1" />
    <script src="http://code.jquery.com/jquery-2.1.0.js"></script>
    <script>
        $.ajax({
            url: "test.php",
            xhrFields: {
                onprogress: function(e) {
                    console.log(e.target.responseText)
                    $("body").html(e.target.responseText)
                    if (e.lengthComputable) {
                        console.log(e.loaded / e.total * 100 + '%');
                    }
                }
            },
            success: function(text) {
                    console.log(text)
                    $("body").html(text+"<h1>done!</h1>")
            }
        });
    </script>
</head>
<body>
<div id="derp">TEST!</div>

</body>
</html>

test.php的

<?php

for($i = 0; $i<20 ; $i++){
    sleep(1);
    echo $i."</br>";
    flush();
    ob_flush(); 
}
?>

1 个答案:

答案 0 :(得分:3)

post是ajax的快捷方式(类型:post),没有什么不同。

获取进度报告有一些方法。我现在最简单的就是将2 ajax请求1发送到同一页面来运行你的php脚本并将状态存储在会话中,将另一个存储到不同页面中从会话中读取状态并将其打印给用户。

更新:

哦,我的错误会话没有写下来,直到php脚本完成。 您可以尝试将状态写入文件并从中读取:

task.php

for ($i = 0; $i < 10; $i++) {
    echo($i . "<br/>");
    file_put_contents('progress', $i);
    sleep(2);
}

progress.php

if (file_exists('progress') && is_readable('progress'))
    echo file_get_contents('progress');
else
    echo(-1);

和脚本:

<script>
    $(document).ready(function () {
        task();
        getProgress();
    });
    function task() {
        $.ajax({
            url: 'http://localhost/test/progress/task.php',
            success: function (data) {
                console.log('Task is over :' + data);
            }
        });
    }
    function getProgress() {
        $.ajax({
            url: 'http://localhost/test/progress/progress.php',
            success: function (data) {
                data = parseInt(data);
                if (data != 9) {
                    console.log('progress :' + data);
                    setTimeout(function () {
                        getProgress();
                    }, 1000);
                }
            }
        });
    }
</script>

BUT是一个多用户环境,会导致问题。

所以你可以做的最好的事情是将状态存储在以下其中一个中:

  • 使用数据库
  • 使用memcache
  • 使用APC