【问题标题】:Can't get long polling with jQuery and PHP to work无法使用 jQuery 和 PHP 进行长轮询工作
【发布时间】:2014-01-27 06:59:20
【问题描述】:

我已经尝试了好几个小时才能让它工作,只是对 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';
?>

【问题讨论】:

标签: javascript php jquery ajax long-polling


【解决方案1】:

注意事项:

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

2:您发送到服务器的时间并不是您所需要的,因此如果用户时间设置错误,例如 6 月 11 日,而服务器中您当前的时间是 6 月 10 日,则

filemtime('./test.txt') &gt; $client_time

总是返回假

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

4:sleep(1) 太高,特别是当你想部署高使用率网站时,把它改成 10ms 以上

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

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

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

var_dump(time() , $client_time);

【讨论】:

  • 感谢您的额外提示,clearstatcache() 是导致它无法工作的问题。
【解决方案2】:

试试这个:

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

【讨论】:

    猜你喜欢
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 2012-10-06
    • 2015-06-25
    • 2013-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多