我有一个简单的长轮询情况。
的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分钟。我已经尝试过在其他问题中看到的一些事情,但到目前为止还没有任何工作。我错过了什么?
答案 0 :(得分:4)
这个黑客为我解决了这个问题。当请求来自XHR请求时,它只会取消sess_update
次呼叫。
在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();
}
}
}
基于this thread的Hack。仅在CI 1.7.2,YMMV上进行了测试。
问题是我很快被解雇了ajax请求。其中一个会定期触发sess_update
。而且,有时,会同时发出第二个ajax请求。该请求将提供最近过期的会话密钥,代码点火器将删除该会话。
此修复程序仅允许对非Ajax请求进行会话更新。这是一个kluge,但它的确有效。
答案 1 :(得分:0)
更改会话配置文件中的sess_expire_on_close
。不太清楚为什么它有帮助......可能是CI中的一个错误。