jQuery setTimeout ajax递归函数在即时消息程序中短时间后抛出错误

jQuery setTimeout ajax recursive function throwing error after short while in instant messaging program

本文关键字:短时间 错误 出错 程序 消息 ajax setTimeout 递归函数 jQuery      更新时间:2023-09-26

正如标题所说,我正在使用jquery、ajax、mysql和php编写一个即时消息程序。目前,我有一个数据库,其中有一个表"switchboard",其中包含字段

mid*,from,to,message,timestamp,read

我有一个函数,它使用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。它的效率要高得多。我的书详细介绍了如何做到这一点,但网上有很多节点/聊天演示。您可以将Node用于聊天服务器,将PHP用于其他一切。

您看到POST错误的原因可能是由于您正在进行的持续轮询。浏览器通常对与给定服务器的并发连接数量有限制。传统上,一个域被限制为2个并发连接,尽管现在在一些浏览器中已经改变了(我认为是Chrome)。我怀疑当POST开始相互"碾压"并超过限制时,您会看到错误。此外,像这样的轮询会很快杀死多用户系统中的服务器。

你想要的不是不断的轮询,而是处理推送消息的东西,比如网络套接字和长轮询回退。插座。IO和Strophie库提供了这一点。我有使用Strophie/XMPP的经验,我可以确认它要复杂得多。插座IO可以轻松扩展到每台服务器数千(或数万)。您目前追求的解决方案远没有可扩展性:)