【发布时间】:2014-12-11 12:21:51
【问题描述】:
我正在编写一个执行时间很长的 php 脚本,我希望能够告诉客户端脚本的进度。
我不能通过输出缓冲来做到这一点,因为脚本是通过 AJAX 调用的(我想保持这种方式)。
我偶然发现了一个解决方案,您可以将进度保存到 $_SESSION 变量并连续调用另一个 PHP 脚本以从 $_SESSION 获取进度。
但是,在我的实现中,这些调用在主(长)进程完成之前不会执行。在 Chrome 开发工具窗口中,调用与主 AJAX 调用一起显示为“待处理”,并且它们都在主调用完成后立即返回进度。
这是主要的长脚本(测试代码):
<?php
@session_start();
for($i=0; $i<10; $i++)
{
$_SESSION["progress"] = $i;
sleep(2);
}
这是更新脚本
<?php
if(isset($_SESSION["progress"]))
echo $_SESSION["progress"];
else
echo 0;
这是javascript
$("form#form-main").submit(function(e) {
e.preventDefault();
var $form = $(this);
var timeout_id;
$form.find("div#popup-overlay").show();
$.ajax(
{
url: $form.attr("action"),
type: $form.attr("method"),
data: new FormData($form[0]),
cache: false,
contentType: false,
processData: false,
xhr: function()
{
//get the native XmlHttpRequest object
var xhr = $.ajaxSettings.xhr();
//update progress
xhr.upload.onprogress = function(e)
{
if(e.lengthComputable)
{
var progress = Math.ceil(e.loaded / e.total * 100);
if(progress < 100)
$form.find("div#popup-content #status").text("UPLOADING " + progress + "%");
else
{
//start getting process progress from server
timeout_id = setInterval(
function()
{
$.post(
"CheckProgress.php",
function(data)
{
$form.find("div#popup-content #status").text("PROCESSED " + data + " pages");
}
);
},
300
);
}
}
};
//return the customized object
return xhr;
},
success: function(data)
{
$form.find("div#popup-content").html(data);
}
}
);
});
如何让 javascript 客户端检索进度?
【问题讨论】:
-
如何将进度写入数据库而不是通过javascript检索结果?
-
会有什么不同?
-
与php分离。可能符合 if(progress
-
我认为问题可能是您的
onprogress仅在第一个 ajax 完成时才被调用,因为它不是可以返回进度的 ajax 调用。尝试同时启动你的第一个 ajax 和第二个 ajax,一个接一个。 -
onprogress 与 AJAX 无关。那只是显示上传进度,不是php执行进度。
标签: javascript php jquery ajax session