使用jQuery和PHP无法进行长时间的轮询

时间:2014-01-27 06:59:20

标签: javascript php jquery ajax long-polling

我一直在努力让这个工作,只是对Web服务器上的PHP脚本的基本长轮询。我正在测试它有一个文本文件,我检查上次修改时间并将其与javascript发送请求的时间进行比较。如果文件的日期较新,那么我发回一条消息“更新”。当我在浏览器中加载页面时,它会发送请求并按预期等待,我可以使用Chrome开发工具验证,但是当我编辑文件时(即更改修改日期),update.php脚本永远不会回复更新消息。相反,它只会持续到超时为止。

我认为它可能与缓存有关,因为如果我将JS请求的URL复制到一个单独的选项卡中它也没有响应但是如果我更改jQuery附加的随机参数以防止缓存我得到了所需的“更新”消息。有什么想法是错的吗?

由于

主页上运行的javascript:

<script>
    window.onload = function longPoll(){
        var d = new Date;
        $.ajax({
            url: "http://localhost/site/update.php?time=" + d.getTime(),
            success: function(data){
                console.log(data);
            },
            error: function (xhr, ajaxOptions, thrownError) {
                //error message here
            },
            type: "GET",
                            cache: false,
            complete: longPoll,
            timeout: 600000
        });
    }
</script>

更新脚本:     

// while the file is NOT newer
while(!(filemtime('./test.txt') > $client_time)) {
    sleep(1);
}

echo 'update';
?>

2 个答案:

答案 0 :(得分:1)

要记住的事情:

1:永远不要相信你从客户那里得到的东西就像时间一样。

2:你发送到客户端服务器的时间实际上并不是你的意思,所以如果用户时间设置错误就像11 jun那么在服务器中你的当前时间是10月,

filemtime('./test.txt') > $client_time

总是返回false

3:检查文件状态时使用clearstatcache()

4:sleep(1)太高,特别是当您想部署高使用率网站时,将其更改为超过10毫秒

5:正如vher2所说,使用此代码完成:

complete: function(jqXHR, status) {
        if (status === 'success'){
            setTimeout(function(){ longPoll() }, 1000);
        }
}

使用此代码检查服务器上的当前时间和从用户收到的时间:

var_dump(time() , $client_time);

答案 1 :(得分:0)

试试这个:

complete: function(jqXHR, status) {
        if (status === 'success'){
            setTimeout(function(){ longPoll() }, 1000);
        }
    }