延迟浏览器Ajax输出(LongPolling)

时间:2014-10-23 11:01:42

标签: javascript php ajax json long-polling

我尝试使用Long Polling完成连接,浏览器向服务器发送请求并等待响应。为了防止这扇门被无限打开,我创建了一个例程,每10秒钟服务器向浏览器发送一个空响应,说明什么都没有。

这一切都很完美,没有任何问题。

我的问题是,当用户点击页面上的链接时,浏览器会等待电源升级的应答呼叫,或者最多可能需要10秒。这使得该工具看起来很慢。

有谁知道如何解决这个问题?

  1. 图像:

    img1

  2. 图片:

    img2

  3. 按照用于拨打电话的JavaScript函数:

    function loadJSON() {
    
        if(libera) {
    
            var data_file = http + "bibliotecas/longpolling/notificacoes.php";
    
            var data = {};
                data.n = long_n;
                data.u = userchat;
                data.m = msgchat;
                data.c = chatUsuario;
    
            http_request.onreadystatechange  = function() {
    
                if(http_request.readyState == 4 && http_request.status == 200) {
    
                    try {
                        var jsonObj = JSON.parse(http_request.responseText);
                        var qtd = jsonObj.funcao.length;
                        if(qtd > 0) {
                            var funcao = "";
                            for(var key in jsonObj.funcao) {
                                funcao = jsonObj.funcao[key];
                                MontarFuncao(eval(funcao),jsonObj.metodo[key]);
                            }
                        }
                    }
                    catch (e) {
                        //alert('Erro - '+ http_request.responseText);
                    }
    
                    loadJSON();
                }
            }
    
            var string = JSON.stringify(data);
    
            http_request.open("POST", data_file, true);
            http_request.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
            http_request.setRequestHeader("Content-length", string.length);
            http_request.setRequestHeader("Connection", "close");
            http_request.send(string);  
    
            return;
        }
    }
    

    遵循负责保持开放的PHP函数,期待数据库中的一些更改:

    ob_start();
    $json = json_decode(file_get_contents(`php://input`));
    
    while($x < 5) {
    
        if(time() >= (15 + $_SERVER['REQUEST_TIME']) || connection_aborted()) {
            echo str_pad(NULL,1);
            die(json_encode(array()));
            flush();
            ob_flush();
            break;
        }
    
        //Query DB
    
        if(count($retorno) > 0) {
            flush();
            ob_flush();
            echo json_encode($retorno);
            exit;           
        }
        else {
            flush();
            sleep(2);
            $x++;
        }
    }
    

0 个答案:

没有答案