2012-02-18 109 views
2

我正在使用jQuery和JSON制作聊天脚本,但由于'资源使用限制',我的主机暂停了它。我想知道是否有可能(以及如何)减少这些请求。我读了一个关于Ajax超时的问题,但我对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">'); 
      } 
     }); 
    }); 
} 

上限为600  请求数/ 5  分钟,我需要使它几乎每个第二。我有一年已经支付,他们没有退款,也无法修改服务器,只能访问cPanel

+0

什么是“资源使用限制”到底是什么?总共请求太多?数据太多?请求频率太高?如果请求太多,那么可能要查看Web套接字? – 2012-02-18 23:16:54

+0

@PaulGrime总共限制600次请求,每次5分钟,试图每秒获得1次请求几乎是实时的。我听说有关AJAX的一些超时,但不明白,:S – Luis 2012-02-19 17:48:07

+3

我强烈建议更改提供程序。这是一个**非常**限制性的恢复 – HerrSerker 2012-02-27 13:25:04

回答

11

那么,600   req/5  如果你想为每个用户提出一个请求/秒,那么min是非常严格的。从本质上讲,这给了你每个用户将需要60  请求/分钟。或300/5  分钟。换句话说,即使你优化你的脚本两个请求合并为一个,最大您可以在您的网站有两个用户;)没有太多的我猜...

你有两个选择:

  1. 坚持通过Ajax请求制作聊天系统并更改托管提供商。如果你不具备2的技能,这实际上可能更便宜。

  2. 忘记制作一个Ajax请求轮询和潜在的另一个推动每一秒。实施一些围绕网络套接字,长轮询或甚至XMPP。 如果你走这条路线,我会看socket.io一个透明的库,它使用web套接字,它们被支持,并且具有后备到长轮询和其他的轮询。对于XMPP方式,出色的Strophe.js。请注意,这两个路由比Ajax请求复杂得多,并且需要大量的服务器逻辑更改。

+0

谢谢,我看到了,但它不仅使聊天请求,并在几个星期前,我看到在互联网上的东西,你可以提出一个请求,每10分钟 – Luis 2012-02-26 23:55:14

+0

并保持超时,所以如果服务器得到一个新的消息,它会返回,如果没有,它会进行一个新的调用,我很快就看到它,所以我不知道如何 – Luis 2012-02-26 23:56:50

+0

抱歉张贴太多的评论,即时消息来自黑莓。没有其他方法吗?另外我不知道这是600/5,但对于每个访问者,由于DDoS和这些东西。 – Luis 2012-02-26 23:58:08

2

ggozad的反应很好,我也推荐web套接字。他们只使用较新的浏览器模型,所以如果你想在所有的浏览器上使用它,你需要一个小的闪存桥接器(Flash可以非常容易地与套接字进行通信,也可以调用JavaScript函数并从JavaScript中调用)。另外,如果您有兴趣,Flash会提供P2P。 http://labs.adobe.com/technologies/cirrus/

另外,对于服务器端你可以看看Node.js如果你是一个JavaScript的风扇和我一样:)

要完成我的回应:有没有办法让巫基于Ajax的聊天,你被限制600  个请求/ 5个 分钟(2个 个请求/秒),想要发送一个请求/秒并且想要两个以上的用户。

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

2

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

2

我不认为检查每一秒真的是一个好主意,在我看来对于网上聊天2/3秒检查应该是远远不够的。

为了减少请求,您还可以在客户端添加用户活动检查,如果窗口处于非活动状态,您可以延长检查时间,当用户返回活动状态时返回2/3秒,将允许您节省资源和请求/分钟

2

我正在开发一个项目,需要保持UI与服务器事件同步。我一直在使用长轮询,这确实会减少ajax调用的数量,但是这会让服务器负担监听客户端感兴趣的事件,这也是无趣的。

我即将切换到我将设置为独立推送服务的socket.io。

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