我需要执行对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
。我错过了什么?
答案 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