我正在使用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">');
}
});
});
}
限制为600 reqs / 5 min,我需要几乎每秒钟。我已经支付了一年而且没有退款,我也无法修改服务器,只能访问cPanel
。
答案 0 :(得分:11)
如果你想为每个用户提出一个请求/秒,那么600 req / 5 min是相当严格的限制。从本质上讲,这使您每个用户将达到60 req / min。或者300/5分钟。换句话说,即使您优化脚本以将两个请求合并为一个,最多可以在您的网站上拥有两个用户;)我猜不多...
您有两种选择:
坚持通过Ajax请求建立聊天系统并更改托管服务提供商。如果你没有这方面的技能,这实际上可能会更便宜。
忘记制作一个Ajax请求进行轮询,可能还有另一个要推送每秒。在Web套接字周围实现一些东西,长轮询甚至XMPP。 如果你走这条路,我会看socket.io一个透明的图书馆,它使用支持它们的网络套接字,并且有长期轮询和其他人的后备。对于XMPP方式,有优秀的Strophe.js。请注意,这两个路由都比Ajax请求复杂得多,并且需要进行大量的服务器逻辑更改。
答案 1 :(得分:2)
ggozad的反应很好,我也推荐网络套接字。它们仅适用于较新的浏览器模型,因此如果您想在所有浏览器上使用它,您将需要一个小型Flash桥(Flash可以非常容易地与套接字通信,也可以调用JavaScript函数并从JavaScript调用)。此外,如果您感兴趣,Flash会提供P2P。 http://labs.adobe.com/technologies/cirrus/
此外,对于服务器端,如果您是像我一样的JavaScript粉丝,您可以查看Node.js:)
要完成我的回复:没有办法进行基于Ajax的聊天,只限600个请求/ 5分钟(2个请求/秒),想要发出请求/秒并且想要超过两个用户。
解决方案:切换到套接字或P2P。
答案 2 :(得分:2)
我建议您使用单个线程(作为API代理)从服务器端调用该付费服务。您仍然可以在此线程中使用600个请求/ 5分钟进行轮询。然后,每个客户端都会执行Ajax请求,无限制地轮询或长时间轮询到您的服务器API代理。
答案 3 :(得分:2)
我不认为检查每一秒真的是个好主意,在我看来,在线聊天2/3秒检查应该足够了。
要获得更少的请求,您还可以在客户端添加对用户活动的检查,如果窗口处于非活动状态,您可以延长检查时间,当用户返回活动时返回2/3秒,这将是允许您节省资源和请求/分钟
答案 4 :(得分:2)
我正在开展一个项目,需要保持UI与服务器事件同步。我一直在使用长轮询,这确实减少了ajax调用的数量,但是它在服务器上负担了监听客户端感兴趣的事件,这也不好玩。
我即将切换到socket.io,我将其设置为单独的推送服务。
现有服务器 - &gt;推送到sockt.io服务器 - &gt;推送订阅客户端