我遇到两个同时运行的AJAX请求的问题。我有一个将数据导出到XSLX的PHP脚本。这个操作需要很多时间,所以我尝试向用户显示进度。我正在使用AJAX和数据库方法。事实上,我很确定它曾经可以工作,但我不明白为什么,它不再在任何浏览器中工作。新浏览器有什么变化吗
$(文档).ready(函数(){
$(“#progressbar”).progressbar();
$.ajax({
类型:“POST”,
url:“{$BASE_url}/export/project/ajaxExport”,
数据:“type={$type}&;progressUid={$progressUid}”//我用来跟踪数据库进度的唯一ID
}).完成(功能(数据){
$(“#进度条框”).hide();
clearInterval(progressInterval);
});
progressInterval=setInterval(函数(){
$.ajax({
类型:“POST”,
url:“{$BASE_url}/ajax/progressShow”,
数据:“statusId={$progressUid}”//相同的uinque ID
}).完成(功能(数据){
data=jQuery.parseJSON(数据);
$(“#progressbar”).progressbar({value:parseInt(data.progress)});
if(data.title){$(“#progressbar title”).text(data.title);}
});
}, 500);
});
- 正在数据库中正确更新进度
- JS计时器正在尝试获取进度,我可以在控制台中看到它,但是所有这些请求都在加载第一个脚本的整个持续时间,一旦脚本结束,这些ajax进度调用就会加载
那么,为什么第二个AJAX调用要等待第一个调用完成呢
听起来像是会话阻塞问题
默认情况下,PHP将其会话数据写入文件。当您使用session_start()启动会话时,它会打开文件进行写入并锁定,以防止并发编辑。这意味着,对于使用会话通过PHP脚本的每个请求,都必须等待第一个会话使用该文件完成
解决此问题的方法是将PHP会话更改为不使用文件或关闭会话,如下所示:
<;?php
会话_start();//开始会话
$_会话['foo']='bar';//如果需要,请将数据写入会话
会话_写入_关闭();//关闭会话文件并释放锁
echo$_会话['foo'];//您仍然可以从会话中读取。