AjaX调用期间的进度仅显示初始值和最终值

时间:2016-11-25 15:45:38

标签: php jquery ajax progress

我需要执行对PHP脚本的AjaX调用,执行时间很长。我的目标是显示此执行的进度状态。

我们的想法是创建一个AjaX调用,定期向服务器询问执行的状态。进度状态存储在$_SESSION['progress']中,最初设置为0,并在执行期间从脚本更改。

这是我在客户端和服务器端的代码。

客户端

// invoke the script (ie. with button)
$('#start').click(function()
{
    $.ajax
    ({
        url: "long-script.php"
    });
});

// check progress periodically
setInterval(progress, 100);
function progress() 
{ 
    $.ajax
    ({
        dataType: "json",
        url: "progress.php",

        success: function(data) 
        {
            console.log(data);
        }
    });
}

长的script.php

// just an example to emulate execution
sleep(1);
$_SESSION['progress']=30;
sleep(1);
$_SESSION['progress']=70;
sleep(1);
$_SESSION['progress']=100;

progress.php

header('Content-Type: application/json');
echo json_encode($_SESSION['progress']);

问题是console.log()正在进行的函数在脚本执行之前输出0,在执行期间停止输出数据,最后在脚本终止时输出100。我错过了什么?

1 个答案:

答案 0 :(得分:0)

问题是在脚本结束或会话关闭之前不会写入会话。

您需要记住,默认情况下,php中的会话作为文件存储在系统中,并在运行时锁定。

您可以做的是稍微更改long-script.php文件。

session_start();

sleep(1);
$_SESSION['progress']=30;
session_write_close();

sleep(1);
session_start();
$_SESSION['progress']=70;
session_write_close();

sleep(1);
session_start();
$_SESSION['progress']=100;
session_write_close();

我们的想法是在每次进度发生变化后写入会话。

然后您需要再次启动会话。

这可能是一种错误的方法,但你总是可以在php中查找会话功能。看一下这个session_write_cloe