Php AJAX请求进度百分比日志
我读的内容来自 我尝试在我自己的站点上制作ajax进度条,但在控制台中,当php脚本完全完成时,我只有xhr响应 我的JS代码部分:Php AJAX请求进度百分比日志,php,ajax,xmlhttprequest,request,Php,Ajax,Xmlhttprequest,Request,我读的内容来自 我尝试在我自己的站点上制作ajax进度条,但在控制台中,当php脚本完全完成时,我只有xhr响应 我的JS代码部分: $('#userSaveData').on('click', function(e){ e.preventDefault(); var $form = $(this).closest('form'); var route = $form.attr('action'); var form
$('#userSaveData').on('click', function(e){
e.preventDefault();
var $form = $(this).closest('form');
var route = $form.attr('action');
var form_data = $form.serializeObject();
$.ajax({
xhr: function()
{
var xhr = new window.XMLHttpRequest();
//Upload progress
xhr.upload.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
//Do something with upload progress
console.log(percentComplete);
}
}, false);
//Download progress
xhr.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
var percentComplete = evt.loaded / evt.total;
//Do something with download progress
console.log(percentComplete);
}
}, false);
return xhr;
},
type: 'post',
url: route,//url to my script below
data: form_data, //some data, not used in script below
success: function(){
console.log('completed');
}
});
return false;
});
例如,我的测试php脚本的一部分是:
<?php
usleep(10000000);
echo true;
?>
我当前的控制台日志首先显示1,然后在大约10秒后写入console.log“completed”
简单地说,我想在ajax请求进行时(php usleep时间约为10秒)在控制台中显示ajax请求的百分比(可能吗?)
请帮助。问题可能出在服务器端,因为客户端似乎是正确的。对
usleep()
的长时间调用可能会冻结服务器输出,如果客户端没有收到HTTP响应状态行,它甚至无法在XHR对象上触发start
事件(例如,服务可能会响应404状态码,这是协议级别的错误,并报告为传递失败)
此外,在将事件传递给JS引擎之前,浏览器可能需要累积一定数量的字节。我在服务器端使用以下脚本发送了N次4KB的数据(4096个八位字节似乎足以让Chrome至少更新进度计数器):
我试过了,但结果是一样的。@user1477508你能更好地描述一下这个问题吗?您是否在控制台中看到任何JS错误?可以在进程回调中设置断点吗?如果您的服务器脚本没有发送任何
内容长度
标题,浏览器如何知道evt.total
?控制台中没有错误,服务器脚本如上所述,请描述我需要添加的内容。请在进程侦听器中设置断点,并告诉evt.total
的值。首先,在xhr.upload listeneru event.total中为198,然后在第二个xhr listeneru event.total中为0
<?php
header("Content-Type: text/plain");
header("Content-Length: " . ($size * $times));
flush();
ob_flush();
$size = 4096;
$times = 5;
function send($size) {
while($size-- > 0) {
echo "A";
}
echo "\n";
}
for ($i = 0; $i < $times; $i++) {
send($size);
flush();
ob_flush();
sleep(1);
}
$.ajax({
xhr: function() {
var xhr = new window.XMLHttpRequest();
xhr.addEventListener("progress", function(evt){
if (evt.lengthComputable) {
console.log(evt.loaded);
}
}, false);
return xhr;
}
, type: 'post'
, cache: false
, url: "sleep.php"});