就像标题所说的那样,我正在使用jquery,ajax,mysql和php编写即时消息传递程序。当前,我有一个数据库,其中的表“ switchboard”包含以下字段
中*,从,到,消息,时间戳,阅读
我有一个使用setTimeout的函数,每隔1到3秒递归检查一次新的未读消息,如下所示:
function get_new_messages(){
if( $('input[name="from"]:checked').val()
&& $('input[name="to"]:checked').val()
&& ready) {
ready=false;
//ajax call
$.ajax({
url: 'chatAjax.php',
type: 'POST',
data: {
checker_from:$('input[name="from"]:checked').val(),
check_to: $('input[name="to"]:checked').val()},
success: function(data){
$('#chat_window').append(data);
ready=true;
setTimeout(get_new_messages,1000);
},
error: function(){
ready=true;
setTimeout(get_new_messages,3000);
}
}
);
} else{
setTimeout(get_new_messages,3000)
}
}
现在,我仅在测试,因此checker_from和check_to对应于包含用户名的单选按钮。我试图使用两个浏览器窗口将消息从一个窗口发送到另一个窗口,但是过一会儿,控制台显示一致的POST错误。这是内存泄漏,还是其他原因。任何帮助将不胜感激
最佳答案
请考虑使用Node.js和Socket.IO。它效率更高。 My book详细介绍了如何执行此操作,但是网络上有许多Node / Chat演示。您可以仅将Node用于聊天服务器,将PHP用于其他所有功能。
您看到POST错误的原因可能是由于您不断进行轮询。浏览器通常对与给定服务器的并发连接数有限制。传统上,一个域仅限于2个并发连接,尽管现在某些浏览器已更改了该连接(我认为是Chrome)。我怀疑您在POST开始彼此“越过”并超过限制时看到错误。此外,像这样进行轮询将迅速杀死多用户系统中的服务器。
您需要的是处理推送消息的东西,而不是不断轮询,例如Web套接字和长时间轮询的后备。 Socket.IO和Strophie库提供了此功能。我有使用Strophie / XMPP的经验-我可以确认它要复杂得多。 Socket.IO可以轻松扩展到每个服务器成千上万(或成千上万)。您当前正在寻求的解决方案远没有可扩展性高:)