我有一个由各种不同阶段组成的上传功能,上传的持续时间可能非常长。为了提高此功能的可用性,我想向用户提供有关上传进度的信息。
上传是通过jQuery处理的,并使用AJAX与数据库进行通信。
要呈现不同的消息,我将在上传脚本的不同阶段更改会话变量(status
)的值。我正在尝试使用setInterval
检查每一秒status
的值,但这不会显示任何内容,也不会导致上传代码无效。
jQuery的:
$('.content form').on('submit', function(e) {
e.preventDefault();
//get session value every second
setInterval(function() {
$.ajax({
url: "index.php?route=module/stock/getStatus&token=<?php echo $_GET['token']; ?>",
success:function(response){
console.log(response);
}
});
}, 1000);
//process upload
$.ajax({
url: $(this).attr('action'),
type: "POST",
data: form_data,
cache: false,
processData: false,
contentType: false,
success: function(data) {
data = $.parseJSON(data);
}
});
});
PHP用于检索会话值(第一个AJAX请求):
echo json_encode($_SESSION['status']);
用于上传的PHP(第二个AJAX请求):
$get = $this->pdf2string($name); //get pdf data
$text = str_replace("\n", ",", $get); //change all new lines to commas
// process replacement strings
$replacements = array(
'Item No.' => 'sku',
'Description' => 'description,stock,discontinued',
);
$_SESSION['status'] = array(
'info' => 'Converting file to CSV'
);
foreach($replacements as $search => $replace) {
$text = str_replace($search, $replace, $text);
}
$_SESSION['status'] = array(
'info' => 'Structuring CSV data'
);
foreach($array as $item) {
// process csv data
}
$_SESSION['status'] = array(
'info' => 'CSV Structured'
);
$this->storeData($new_array); //store data
如何同时使用两个AJAX请求?
我在XAMPP上使用Windows 8.1,但是我有一个测试服务器仍然会产生上面讨论的相同结果。
任何帮助都会很棒!
答案 0 :(得分:1)
要记住以下几点:
您的浏览器将限制同时发出的请求数。这取决于浏览器,可以是2到8之间的任何地方。
服务器可能在等待资源(被另一个请求锁定)时锁定请求。如果您正在使用会话,请确保尽快关闭会话,或者同时请求等待。
您可能希望查看推送通知(而不是拉取)来获取进度数据。您可以使用websockets或eventsource。
答案 1 :(得分:1)
听起来您的计算机没有处理多个连接。我在superuser.stackexchange上发现了类似的问题 - XAMPP apache not handling multiple requests
他的解决方案是:
每次要写入时都会启动和停止会话 会议有效。
如果没有他提供任何代码,我怀疑他做了类似的事情:
session_start();
$_SESSION['status'] = array('info'=>'msg goes here');
session_write_close();
//...
session_start();
$_SESSION['status'] = array('info'=>'another msg goes here');
session_write_close();
//...
答案 2 :(得分:1)
好吧,我认为setInterval有点乱,因为即使先前的代码处于i / o等待或网络延迟,它也会在定时间隔内执行。 第二件事是你必须在预定的任务完成后释放它。
所以我稍微修改了你的代码,
var status_fun=function() {
$.ajax({
url: "index.php?route=module/stock/getStatus&token=<?php echo $_GET['token']; ?>",
success:function(response){
console.log(response);
/////////////////////////////////////////////////////////
//Add Something to quit this timed loop after completion
//And please do handle ajax error case too
setTimeout(status_fun,1000);
/////////////////////////////////////////////////////////
}
});
};
$('.content form').on('submit', function(e) {
e.preventDefault();
status_fun();
$.ajax({
url: $(this).attr('action'),
type: "POST",
data: form_data,
cache: false,
processData: false,
contentType: false,
success: function(data) {
data = $.parseJSON(data);
}
});
});
希望它有所帮助,因为我不确定你的目标。