2

我有一个简单的长轮询情况。

jQuery

function poll(){
    $.get(url,{},function(data){ poll(); });
}

PHP (为简洁起见删除了计时内容)

function responds_to_poll()
{
    if( ! $this->current_user()->is_logged_in())
    {
        redirect('auth/login');
    }

    echo json_encode("Whats up?");
}

我将观看 Firebug 5-10 分钟,它工作正常,但最终它会说GET (302 Redirect)并且响应将包含我auth/login.php文件中的 html。

会话是由本地CI_Session类驱动的数据库。它们在 2 小时后到期,而不是 5-10 分钟。我已经尝试了在其他问题中看到的一些东西,但到目前为止没有任何效果。我错过了什么?

4

2 回答 2

4

这个hack为我解决了这个问题。sess_update它只是在请求来自 XHR 请求时取消调用。

在你的定义这个system/application/config/constants.php

define('IS_AJAX', isset($_SERVER['HTTP_X_REQUESTED_WITH']) && strtolower($_SERVER['HTTP_X_REQUESTED_WITH']) == 'xmlhttprequest');

然后,system/application/libraries/My_Session.php使用以下内容创建:

class MY_Session extends CI_Session {
    public function __construct($params = array())
    {
            parent::CI_Session($params);
    }

    public function sess_update()
    {
            if ( IS_AJAX )
            {
                    parent::sess_update();
            }
    }
}

黑客基于这个线程。仅在 CI 1.7.2、YMMV 上测试。

问题是我很快就被解雇了 ajax 请求。周期性地,sess_update在其中一个上触发 a。而且,有时,会同时出现第二个 ajax 请求。该请求将提供最近过期的会话密钥,并且代码点火器将删除该会话。

此修复仅允许对非 ajax 请求进行会话更新。这是一个kluge,但它的工作原理。

于 2012-07-12T21:14:17.633 回答
0

更改sess_expire_on_close会话配置文件。不太清楚为什么它会有所帮助......可能是 CI 中的一个错误。

于 2012-07-12T20:56:29.207 回答