Ajax循环覆盖PHP脚本


Ajax Loop Overwhelms PHP Script

这在检索php数据时非常有效,比如15次通过,但当json文件是100个项目时,它会阻塞php脚本并产生随机错误。我的猜测是,因为请求都是从这个单一的ajax请求中发出的(比php脚本的工作速度更快),php脚本会感到困惑吗?

    $(document).ready(function(){
        var ajax_load = "<div class='loadwrap'><img class='load' src='/img/load.gif' style='width:12px;' alt='' /> fetching list...</div>";
        $("#status").html(ajax_load);
        $.getJSON('/fsbo/get_urls_24_hours', function(data) {
            $("#alias").fadeOut('slow');
            var ajax_load = "<div class='loadwrap'><img class='load' src='/img/load.gif' style='width:12px;' alt='' /> fetching property...</div>";
            $('#props').html('');       
                $.each(data, function(key, val) {
                    $.ajax({
                        type: "POST",
                        url: base_url + "/fsbo/get_property",
                        data: "url="+ val,
                        cache:false,
                        success:
                        function(data){
                        $("<div></div>").html(data).appendTo('#props');
                        }
                    }); 
                });
        }); 
    });

作为旁注,我应该把隐藏加载gif放在哪里?把它放在循环的末尾没有好处——它只是打开和关闭,而不等待数据的返回。

在循环中发出AJAX请求通常是个坏主意。为什么不修改原始调用以返回JSON中所需的所有数据,而不是进行100次调用呢。

如果由于某种原因无法避免这种情况,请限制挂起请求的数量。例如,发送前5个请求,然后在收到前5个中的一个请求的响应后才发送第6个请求。这样,任何时候只有5个请求处于挂起状态,并且您的服务器不会同时收到100个请求。

这个被剪切的代码是致命的。

$.each(data, function(key, val) {
       $.ajax({

如果data的长度为100,则将有100个http连接到您的服务器。这显然会阻塞您的服务器。此外,你的浏览器会变慢。这就像在Firefox中一次打开100个标签。

通过一个Ajax请求传递所有数据。如果大小巨大,则逐块发送。当您收到第一个响应时,发送下一个区块的请求。但不要同时发送。

我确实认为你有正确的答案,这是因为这个调用。

PHP调用的工作方式是创建对系统的单独调用,同时调用各种其他库,从而调用某种内存泄漏,这会成倍地增加所需的时间和资源。

我的建议是,将所有变量传递给PHP,让它完成工作,然后接收一个JSON对象,并对其进行解析

对于最终用户来说,它可能会慢一点,但应该有助于避免这种情况的发生。

p.S.

我也遇到过类似的问题,当这种调用为一个用户发出如此多的请求时,整个Web服务器都崩溃了。