PHP jQuery长轮询聊天应用程序

时间:2012-11-17 22:48:51

标签: php javascript jquery ajax long-polling

我使用短轮询(AJAX刷新)制作了一个简单的PHP jQuery聊天应用程序。比如,每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);

PHP

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

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

        usleep(1000000); // 1 Second
    }
?>

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

2 个答案:

答案 0 :(得分:5)

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

长轮询

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

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

jQuery .ajax()

$.ajax()立即返回。这个不好。您有两种方法可以解决这个问题:

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

使用此:

var x = $.ajax({blah});
$.when(x).done(function(a) { recursiveCallHere(); });

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

P.S:sleep(1)出了什么问题?

答案 1 :(得分:3)

在长轮询中,当您收到上一个数据时,应启动新请求。否则,您将在浏览器冻结中进行无限递归。

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

            getNewMessage();   // <-- should be here
        }
    });
}