Javascript 减少Ajax请求

Javascript 减少Ajax请求,javascript,jquery,ajax,resources,server-side,Javascript,Jquery,Ajax,Resources,Server Side,我正在使用jQuery和JSON制作聊天脚本,但由于“资源使用限制”,我的主机将暂停它。我想知道是否有可能(以及如何)减少这些请求。我读了一个问题,其中他们讲述了一些关于Ajax超时的事情,但我不太擅长Ajax。代码是: function getOnJSON() { var from; var to; var msg_id; var msg_txt; var new_chat_string; //Getting the data from the

我正在使用jQuery和JSON制作聊天脚本,但由于“资源使用限制”,我的主机将暂停它。我想知道是否有可能(以及如何)减少这些请求。我读了一个问题,其中他们讲述了一些关于Ajax超时的事情,但我不太擅长Ajax。代码是:

function getOnJSON() {
    var from;
    var to;
    var msg_id;
    var msg_txt;
    var new_chat_string;

    //Getting the data from the JSON file
    $.getJSON("/ajax/end.emu.php", function(data) {
        $.each(data.notif, function(i, data) {
            from = data.from;
            to = data.to;
            msg_id = data.id;
            msg_txt = data.text;
            if ($("#chat_" + from + "").length === 0) {
                $("#boxes").append('...some stuf...');
                $('#' + from + '_form').submit(function(){
                    contactForm = $(this);
                    valor = $(this + 'input:text').val();
                    destinatary = $(this + 'input[type=hidden]').val();
                    reponse_id = destinatary + "_input";
                    if (!$(this + 'input:text').val()) {
                        return false;
                    }
                    else {
                        $.ajax({
                            url: "/ajax/end.emu.php?ajax=true",
                            type: contactForm.attr('method'),
                            data: contactForm.serialize(),
                            success: function(data){
                                responsed = $.trim(data);
                                if (responsed != "success") {
                                    alert("An error occured while posting your message");
                                }
                                else {
                                    $('#' + reponse_id).val("");
                                }
                            }
                        });
                        return false;
                    }
                });

                $('#' + from + '_txt').jScrollPane({
                    stickToBottom: true,
                    maintainPosition: true

                });
                $('body').append('<embed src="http://cdn.live-pin.com/assets/pling.mp3" autostart="true" hidden="true" loop="false">');
            }
            else {
                var pane2api = $('#' + from + '_txt').data('jsp');
                var originalContent = pane2api.getContentPane().html();
                pane2api.getContentPane().append('<li id="' + msg_id + '_txt_msg" class="chat_txt_msg">' + msg_txt + '</li>');
                pane2api.reinitialise();
                pane2api.scrollToBottom();
                $('embed').remove();
                $('body').append('<embed src="http://cdn.live-pin.com/assets/pling.mp3" autostart="true" hidden="true" loop="false">');
            }
        });
    });
}
函数getOnJSON(){ var来自; var-to; 变量msg_id; var msg_txt; var新的聊天字符串; //从JSON文件获取数据 $.getJSON(“/ajax/end.emu.php”),函数(数据){ $.each(data.notif,函数(i,数据){ from=data.from; to=data.to; msg_id=data.id; msg_txt=data.text; 如果($(“#聊天室+来自+”)。长度==0){ $(“#框”).append(“…一些stuf…”); $(“#”+from+”\u form')。提交(函数(){ contactForm=$(此项); valor=$(此+‘输入:文本’).val(); destinatary=$(this+'input[type=hidden]')。val(); reponse_id=目标+“_输入”; if(!$(此+'输入:text').val()){ 返回false; } 否则{ $.ajax({ url:“/ajax/end.emu.php?ajax=true”, 类型:contactForm.attr('method'), 数据:contactForm.serialize(), 成功:功能(数据){ 响应=$.trim(数据); 如果(响应!=“成功”){ 警报(“发布邮件时出错”); } 否则{ $(“#”+reponse_id).val(“”); } } }); 返回false; } }); $('#'+from+'_txt').jScrollPane({ stickToBottom:没错, 位置:正确 }); $('body')。追加(''); } 否则{ var pane2api=$('#'+from+'#txt')。数据('jsp'); var originalContent=pane2api.getContentPane().html(); pane2api.getContentPane().append(“
  • “+msg\u txt+”
  • ”); pane2api.reinitialise(); pane2api.scrollToBottom(); $('embed').remove(); $('body')。追加(''); } }); }); }
    限制为600reqs/5min,我几乎每秒都需要这样做。我已经支付了一年的费用,他们没有退款,而且我不能修改服务器,只能访问
    cPanel

    好吧,如果你想每秒钟为每个用户发出一个请求,600req/5min是非常有限制的。从本质上讲,每个用户都会发出60req/min.或300/5min的请求。换句话说,即使您优化了脚本以将两个请求合并为一个请求,您的站点最多可以有两个用户我想没什么

    您有两个选择:

  • 坚持通过Ajax请求创建聊天系统,并更改托管提供商。如果你没有做2的技能,这可能会更便宜

  • 忘了让Ajax请求轮询,或者每秒推送一次。围绕web套接字、长轮询甚至其他应用程序实现一些功能。 如果你这样做的话,我会寻找一个透明的库,它使用支持web套接字的web套接字,并有长轮询和其他轮询的回退。对于XMPP方式,有一种非常好的方法。请注意,这两种路由都比Ajax请求复杂得多,需要对服务器逻辑进行大量更改


  • ggozad的反应很好,我也推荐WebSockets。它们只适用于较新的浏览器型号,因此,如果您想在所有浏览器上使用它,您将需要一个小型的Flash桥接器(Flash可以非常轻松地与套接字通信,还可以调用JavaScript函数并从JavaScript调用)。此外,如果您感兴趣,Flash还提供P2P

    此外,对于服务器端,如果您是像我这样的JavaScript粉丝,您可以查看:)

    为了完成我的回答:没有办法进行基于Ajax的聊天,在这种情况下,您的请求限制为600requests/5min(2requests/s),想要每秒发出一个请求,并且想要两个以上的用户


    解决方案:切换到套接字或P2P。

    我建议您使用单个线程(作为API代理)从服务器端调用该付费服务。您仍然可以在此线程中以每5分钟600个请求进行轮询。然后,每个客户端都会无限制地向服务器API代理执行Ajax请求轮询或长轮询。

    我不认为每秒检查都是一个好主意,在我看来,对于在线聊天,2/3秒检查应该足够了


    为了获得更少的请求,您还可以在客户端添加对用户活动的检查,如果windows处于非活动状态,您可以延长检查时间,当用户恢复活动状态时,返回到2/3秒,这将允许您节省资源和请求/分钟

    我现在正在处理一个项目,该项目要求用户界面与服务器事件保持同步。我一直在使用长轮询,这确实减少了ajax调用的数量,但这会给服务器带来负担,使其无法侦听客户机感兴趣的事件,这也不好玩

    我即将切换到socket.io,我将把它设置为一个单独的推送服务


    现有服务器-->推送到sockt.io服务器-->推送到订阅客户端

    什么是“资源使用限制”?总共有太多的请求?数据太多?请求频率太高?如果请求太多,那么可以查看Web套接字?@PaulG