我有两个AJAX调用,第一个启动一个长时间运行的脚本,第二个调用一个百分比字段的数据库表。出于某种原因,在进行第二次AJAX调用时,数据库调用将始终返回false,直到完成第一次调用后,这会使轮询表的百分比更新失败。
第一
<script type="text/javascript">
$.ajax({
async: true,
url: "<?php echo BASE_URL.DS.'controller'.DS.'long_running_script';?>",
data: {
file: "<?php echo $file;?>",
id: "<?php echo $id;?>"
},
type: 'post',
beforeSend:function(){
$("#loading").show();
$('#progressbar').progressbar({
value: false
});
},
success:function(data) {
$('#response').empty().html(data);
},
complete:function(){
$("#loading").hide();
}
});
});
</script>
第二
<script type="text/javascript">
$(function(){
var getProgress = $.ajax({
async: true,
url: "<?php echo BASE_URL.DS.'controller'.DS.'pending';?>",
data: {
id: "<?php echo $id;?>",
},
dataType: "json",
success: function (data) {
},
complete: getProgress,
timeout: 30000
});
setInterval(function(){
getProgress.done(function(data){
console.log(data.pending);
});
}, 3000);
</script>
返回false的第二个调用请求db中的百分比字段,该字段由长时间运行的脚本更新。我还注意到在我的本地机器上,每个对虚拟主机的HTTP请求都会挂起,直到第一个AJAX调用完成。第一次调用是否可能以某种方式阻止与服务器的连接?
答案 0 :(得分:0)
问题是由于多个AJAX调用之间的资源消耗,PHP会对会话文件进行锁定。但是,session_write_close可以删除会话文件的写权限,直到再次启动会话。使用自定义会话处理程序同时将会话保存到数据库而不是文件似乎可以很好地作为长期解决方案。