【问题标题】:AJAX Long-polling doesn't keep connection openAJAX 长轮询不保持连接打开
【发布时间】:2012-04-18 21:14:18
【问题描述】:

过去两天我一直在尝试让它工作,但没有运气。它执行一次,但在初始加载后无法继续更新。该功能不会自动更新,也不会在 30 秒后重新启动。该代码对我来说似乎很好,但显然我对长轮询存在一些知识差距,这导致它不起作用。如果有人有时间,如果您能梳理一下并告诉我我做错了什么,我将不胜感激。任何帮助表示赞赏,谢谢。

JavaScript/jQuery

function poll(pid){
    var dataString = 'pid=' + pid;
    $.ajax({type: 'GET', url: 'http://localhost:8888/mysite/execs/vote_count.php', data: dataString, async: true, cache: false, success: function(data){

 var post = $('#' +pid);
    var post_children = post.children();
    var upvotes = post_children.find('.upvotes');
    var downvotes = post_children.find('.downvotes');

downvotes.text("-" + data.downvotes);
upvotes.text("+" + data.upvotes);

    }, dataType: "json", complete: poll, timeout: 30000 });
};

$(".post").each(function(){
poll($(this).attr("id"));
});

PHP (vote_count.php)

<?php
$hostname = 'localhost';
$username = 'root';
$password = 'root';
$database = 'database';
try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $dbh->prepare("SELECT * FROM vote WHERE post = :pid AND rating = 'votedown'");
    $pid = $_GET['pid'];
    $stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
    $stmt->execute();
    $result = $stmt->fetchAll();
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
    $stmt->execute();
    $downvotes = $stmt->rowCount();


    try {
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $stmt = $dbh->prepare("SELECT * FROM vote WHERE post = :pid AND rating = 'voteup'");
    $pid = $_GET['pid'];
    $stmt->bindParam(':pid', $pid, PDO::PARAM_STR);
    $stmt->execute();
    $result = $stmt->fetchAll();
    }
catch(PDOException $e)
    {
    echo $e->getMessage();
    }
    $stmt->execute();
    $upvotes = $stmt->rowCount();
$arr = array("downvotes"=>$downvotes,"upvotes"=>$upvotes);
echo json_encode($arr);  
$dbh = null;
?>

【问题讨论】:

    标签: php javascript jquery ajax long-polling


    【解决方案1】:

    我认为您遇到的主要问题是您假设 complete: poll 将使用当前调用中传入的参数 pid 。试试这个。

    function poll(pid){
        var dataString = 'pid=' + pid;
        $.ajax({type: 'GET', 
            url: 'http://localhost:8888/mysite/execs/vote_count.php', 
            data: dataString, 
            async: true, 
            cache: false, 
            success: function(data){
                var post = $('#' +pid);
                var post_children = post.children();
                var upvotes = post_children.find('.upvotes');
                var downvotes = post_children.find('.downvotes');
    
                downvotes.text("-" + data.downvotes);
                upvotes.text("+" + data.upvotes);
            }, 
            dataType: "json", 
            complete: function(xhr, status){
                setTimeout(function(){poll(pid);}, 30000);
            }, 
            timeout: 30000 
        });
    }
    
    $(".post").each(function(){
        poll($(this).attr("id"));
    });
    

    话虽如此,如果您有很多帖子要检查更新,您可能会考虑将这些调用捆绑起来,并每 30 秒每页调用一次(并返回一组帖子更新),而不是每页每个帖子调用一次每 30 秒。 (我额外的两分钱。)

    编辑:添加了提到的超时。第一次把它漏掉了。

    【讨论】:

    • 你说得对,这是我的主要问题。我很惊讶我没有考虑到这一点。然而,尽管有这个问题,我的理解是这个连接应该保持打开并创建(看似)自动更新。否则我只能使用 setInterval。然而,即使在最初的 30 秒内,也没有任何变化。
    • 我的 PHP 是一个小星期,但我在你的 javascript 中没有看到任何东西来保持连接打开。当 AJAX 调用超时时,所有超时都会被覆盖,并且 jQuery 每个只为每个帖子调用一次 poll 函数。
    • 这里有一个更好更简洁的长池化模式blog.falafel.com/Blogs/basem-emara/2012/06/06/…
    【解决方案2】:

    我认为一旦你收到回复.. 浏览器不会也不应该保持连接打开.. 这也很大程度上取决于你使用的浏览器和你发送的标题.. 我不是一个 PHP 人,但是。 . Header shud 包含 Connection:Keep-alive 以保持连接打开。
    。 还通过了我进行的各种测试。
    1. IE 不会保持现有连接打开,而是会同时打开 2 个连接,并会保持第二个打开并关闭第一个。
    2.Chrome 可以很好地发送 2 个请求(一个用于网站图标)但保持连接打开。
    3. Mozilla 只发送一个请求并保持打开状态。
    你是用IE9来测试的吗?

    【讨论】:

    • 我在 Chrome 上,也在不是双启动 Windows 的 Mac 上,所以即使我想我也无法在 IE9 中测试它,除非我将文件转移到我朋友的电脑上。
    • 我的错误..:(你能检查一下你从服务器返回的响应头吗。
    猜你喜欢
    • 2017-08-15
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 2011-06-14
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多