【问题标题】:AJAX Long Polling with PHP Sessions使用 PHP 会话的 AJAX 长轮询
【发布时间】:2016-01-10 05:55:19
【问题描述】:

我有以下几点:

脚本:

function poll(){
    $.ajax({
        ...
        url: poll.php,
        success: function(res){
            $('#count').html(res);
            poll();
        }
    });
}
poll();

poll.php:

session_start();
$count = $_SESSION['count'];
session_write_close();
while(true){
    $newcount = $_SESSION['count'];
    if($newcount != $count){
        $count = $newcount;
        break;
    }
    sleep(1);
}
echo $count;

在我的 php 中,当 $_SESSION['count'] 发生更改时,它会脱离 while loop 然后更新 DOM 元素 '#count 然后再次轮询更改。但我的问题是,当我尝试从另一个实例更改$_SESSION['count'] 时,运行poll 的实例继续等待请求完成。这意味着在我的poll.php 中,即使我从另一个实例更改了$_SESSION['count'],它也不会脱离while loop

这里有什么问题?

【问题讨论】:

  • 你在哪里换$_SESSION['count']? (它不在您粘贴的代码中。)
  • @jbafford 我只是用session_start();$_SESSION['count'] = anynum 执行一个php;

标签: php jquery ajax session


【解决方案1】:

在您session_write_close() 之后,会话关闭。这意味着进一步的更改不会反映在$_SESSION 中。

您需要重新打开会话才能从中读取:

session_start();
$count = $_SESSION['count'];
session_write_close();
while(true){
    session_start();
    $newcount = $_SESSION['count'];
    session_write_close();

    if($newcount != $count){
        $count = $newcount;
        break;
    }
    sleep(1);
}
echo $count;

但是请注意,在您的网络服务器上运行这样的无限循环通常不是一个好主意。您可以轻松地让自己面临拒绝服务攻击:在该无限循环中运行的每个 php 会话都在消耗内存和与 Web 服务器的开放连接,因此您很快就会发现您的 Web 服务器无法响应请求,因为它的所有工作人员都在无限循环中旋转。

如果您确实需要在 PHP 中执行此操作,我强烈建议工作人员在一段时间后自动退出。更好的是使用专门用于长轮询的其他技术(例如,node.js WebSockets 服务器)。

【讨论】:

    猜你喜欢
    • 2011-01-21
    • 2011-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-24
    • 2015-09-08
    • 2011-04-20
    相关资源
    最近更新 更多