5

在我的项目(带有Symfony 2 的PHP)中,我在每个页面中都做了很多Ajax请求。我遇到了很多问题,因为看起来浏览器(在Google ChromeFirefox中测试)正在中止请求而没有给我一个错误。我已经做了一个干净的页面来测试可能导致此问题的原因并且错误仍然存​​在。我已经尝试在一个循环中执行 10 个请求的测试(我相信我们没有任何问题,对吧?)。for

这是我的代码:

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Test page</title>
    </head>
    <body>Test page.
        <script type="text/javascript" src="/js/compressed_jquery-1.8.2.min_1.js"></script>
        <script type="text/javascript">
            $(document).ready(function() {
                for (var i = 0; i < 10; i++) {
                    $.get('/i18n/javaScript/pt.json', function(data) {
                        console.log(data);
                    });
                }
            });
        </script>
    </body>
</html>

这是Firebug中请求结果的屏幕截图:

Ajax 请求截图

如您所见,有些请求已完成,有些则未完成。有时浏览器会完成所有 10 个请求而不会出错。这可能是什么原因造成的?


我已经测试了所有解决方案,但我很确定这是 Windows、Apache 或 PHP 配置问题。今天我在我的机器上配置了一个虚拟机, VirtualBox运行Ubuntu 13.04 (Raring Ringtail) 和 Apache 2.2 + PHP,并且没有发生错误,证明这与我的JavaScriptHTML或 PHP 代码无关。我不确定这是配置问题。如何发现此配置?

4

4 回答 4

4

可以满足您的需求,一个一个发送请求应该避免服务器拒绝一些并行请求:

测试它

$(document).ready(function () {
    var tot = 30; //to simulate 30 requests
    (function request(i){
        if(i === tot) return;
        $.get('/echo/html/?'+i, function (data) {
            console.log("success");
        }).always(function() { request(++i) });
    })(0);
});
于 2013-05-21T11:27:13.513 回答
2

我认为您的服务器响应时间过长并且浏览器超时。可能浏览器将只有两个与服务器的打开连接,并且在前两个花费太长时间时中止最后一个 8/10。我会检查您的服务器日志以确认这一点。

服务器看到请求时在做什么/i18n/javaScript/pt.json?四秒钟是很长的时间。尝试获取一些静态内容,例如图像或一些静态HTML,而不是pt.json查看是否可以解决问题。

如果你需要做大量的计算来产生pt.json,它可以被缓存吗?它很大吗?你在用阿帕奇吗?

于 2013-05-21T17:06:28.580 回答
2

您可以使用全局对象序列化请求:

function AjaxRequester() {
    this.queue = [];
}

AjaxRequester.prototype.doRequest(request){
    if (this.queue.length>0){
        this.queue.push(request)
    }
    else 
       handleRequest(request)
}

AjaxRequester.prototype.handleRequest(request){
    /* actually handle ajax request, on complete inspect 
       queue and if not empty recall this method on the first
       element */
}

requester = new AjaxRequester();

进入你的代码,做

requester.doRequest(yourRequest);
于 2013-05-27T22:15:42.133 回答
0

如果这是一个缓存问题,那么你可以试试这个:

在页面标题中添加以下标记。这将阻止浏览器缓存任何数据。

<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1990 12:00:00 GMT" />

这将在大多数浏览器中禁用缓存,并且您的数据将在每次刷新时获取,因为没有缓存,

还有一件事。您的数据被循环调用......我可以说这是一个具有相同请求的连续调用,因此该请求可能被视为重复请求并可能被服务取消;因为如果一次又一次地发送相同的请求,这可能会被视为大量请求......

尝试在通话时添加一些东西,就像这样..

for (var i = 0; i < 10; i++) {
    $.get('/i18n/javaScript/pt.json?v='+i, function(data) {
        console.log(data);
    });
}

并用一些东西处理请求。试试看有没有用。。

如果使用jQuery调用 open() ,它是内置的,并且会产生效果。

参考 Stack Overflow 旧帖子如何解决 Firebug 在 Ajax 请求时的“Aborted”消息?.

我相信这会给你带来积极的解决方案......

于 2013-05-27T09:59:22.900 回答