PHP jQuery长轮询聊天应用程序

Tej*_*hav 2 javascript php ajax jquery long-polling

我用短轮询(AJAX Refresh)创建了一个简单的PHP jQuery Chat应用程序.比如,每2到3秒就要求新消息.但是,我读到Long Polling是一种更好的聊天应用程序方法.所以,我经历了一些Long Polling脚本.我是这样做的:

使用Javascript:

$("#submit").click(function(){
    $.ajax({
        url: 'chat-handler.php',
        dataType: 'json',
        data: {action : 'read', message : 'message'}
    });
});

var getNewMessage = function() {
    $.ajax({
        url: 'chat-handler.php',
        dataType: 'json',
        data: {action : 'read', message : 'message'},
        function(data){
            alert(data);
        }
    });

    getNewMessage();
}

$(document).ready(getNewMessage);
Run Code Online (Sandbox Code Playgroud)

PHP

<?php
    $time = time();
    while ((time() - $time) < 25) {
        $data = $db->getNewMessage ();

        if (!empty ($data)) {
            echo json_encode ($data);
            break;
        }

        usleep(1000000); // 1 Second
    }
?>
Run Code Online (Sandbox Code Playgroud)

问题是,一旦getNewMessage()启动,它将执行,除非它得到一些响应(来自chat-handler.php).它以递归方式执行.但是如果有人想在其间发送消息,那么实际上该函数($("#submit").click())永远不会执行,因为getNewMessage()仍在执行.那么有什么解决方法吗?

Séb*_*uld 5

我强烈建议你阅读两件事:长轮询和jQuery回调背后的想法.我会很快进入两者,但只有这个盒子允许我这么详细.

长期民意调查

长轮询背后的想法是让网络服务器在返回请求时人为地"减速",以便等待事件发生,然后立即提供信息,并关闭连接.这意味着你的服务器将闲置一段时间(好吧,不是空闲,但你知道我的意思),直到它最终获得消息通过的信息,将其发送回客户端,然后继续进行下一个一.

在JS客户端,效果是Ajax 回调(这是重要的一点)被延迟了.

jQuery .ajax()

$.ajax()马上回来.这个不好.您有两种方法可以解决此问题:

  • 在成功和错误回调函数中绑定您的递归调用(这很重要.错误函数可能会因超时而出现)
  • (见下文):

用这个:

var x = $.ajax({blah});
$.when(x).done(function(a) { recursiveCallHere(); });
Run Code Online (Sandbox Code Playgroud)

两者最终都是相同的.你在回调时触发你的递归,而不是在启动时.

PS:怎么了sleep(1)