【发布时间】:2013-03-19 04:05:25
【问题描述】:
我遇到了两个同时运行的 AJAX 请求的问题。我有一个将数据导出到 XSLX 的 PHP 脚本。这个操作需要很多时间,所以我试图向用户展示进度。我正在使用 AJAX 和数据库方法。实际上,我很确定它曾经可以工作,但我不知道为什么,它不再在任何浏览器中工作。新浏览器有什么变化吗?
$(document).ready(function() {
$("#progressbar").progressbar();
$.ajax({
type: "POST",
url: "{$BASE_URL}/export/project/ajaxExport",
data: "type={$type}&progressUid={$progressUid}" // unique ID I'm using to track progress from database
}).done(function(data) {
$("#progressbar-box").hide();
clearInterval(progressInterval);
});
progressInterval = setInterval(function() {
$.ajax({
type: "POST",
url: "{$BASE_URL}/ajax/progressShow",
data: "statusId={$progressUid}" // the same uinque ID
}).done(function(data) {
data = jQuery.parseJSON(data);
$("#progressbar").progressbar({ value: parseInt(data.progress) });
if (data.title) { $("#progressbar-title").text(data.title); }
});
}, 500);
});
- 数据库中的进度正在正确更新
- JS 计时器正在尝试获取进度,我可以在控制台中看到它,但是所有这些请求都在加载第一个脚本的整个持续时间,一旦脚本结束,这些 ajax 进度调用就会被加载
那么,为什么第二个 AJAX 调用要等待第一个调用完成?
【问题讨论】:
-
一些 PHP Web 服务器配置只允许每个会话一个连接同时运行。因此,如果您正在使用会话,请在您 (a) 开始会话,然后 (b) 休眠 60 秒的页面中尝试进行实验。然后尝试在同一个浏览器中加载该页面的多个实例 - 它们可能会一个接一个地加载。
-
你最近更新了jQuery版本吗?
-
另外,一般来说,一个以上的 AJAX 操作并不是最佳实践,因为过多的 HTTP 调用会浪费时间。你能把它们合并成一个,然后在一个 JSON 字符串中返回几个结果吗?
-
如果您使用服务器端会话,PHP 默认会在请求处于活动状态时锁定会话文件,这意味着您在任何时候都不能有多个未完成的请求处于活动状态。
-
马克 B 你是对的!这是会话问题。我正在使用 codeigniter 会话库,但我最近将其更改为本机会话库,我没有意识到这可能是问题所在。谢谢。您可以将其发布为答案,以便我将其标记为已接受。
标签: php ajax progress-bar simultaneous