作者StringR (MoO~)
看板PHP
标题Re: [请益] CodeIgniter + ion_auth登入插件问题
时间Fri Aug 24 02:27:59 2012
※ 引述《rockmanalpha (KIN)》之铭言:
: 正常来说SESSION每 5分钟(300) 会更新SESSION的上次活动时间
: 然後当这个时间与现在时间作比较 超过 SESSION有效时间 2小时(7200)
: 就视作SESSION无效 但很奇怪的是 现在我用ion_auth 无论系统闲置与否
: 在5分钟後 即 sess_time_to_update =300 CI会帮我产生一个新的SESSIONID
: 然後我原本的SESSION就无效了 但是旧的活动时间有更新到 = = 可是我明明设定了
: SESSION有效时间是7200呀 请问各位板友有用过这个framework跟插件吗 感谢
这问题,你观察到的结果是正确的。
我们来看一下CI处理session的原始码,其中每n分钟更新session的部份:
// We only update the session every five minutes by default
if (($this->userdata['last_activity'] + $this->sess_time_to_update)
>= $this->now)
{
return;
}
// Save the old session id so we know which record to
// update in the database if we need it
$old_sessid = $this->userdata['session_id'];
$new_sessid = '';
while (strlen($new_sessid) < 32)
{
$new_sessid .= mt_rand(0, mt_getrandmax());
}
我只节录前面一点点,第一个IF检查了这个session的最後活动时间(last_activity),
格式是unix timestamp,他会纪录你上次产生这个session的时间。
如果last_activity + session更新时间,大於现在的话,表示这个session产生到现在
还没超过5分钟,直接返回,啥事都不做。
但是如果超过5分钟的话,你看他的注解,是保存旧资料,换一个新的session_id。
所以你观察到每5分钟,就会重新产生一个session id,这没问题,符合设计!
=========================================================================
再来我们来看过期的部份:
// Is the session current?
if (($session['last_activity'] + $this->sess_expiration) < $this->now)
{
$this->sess_destroy();
return FALSE;
}
这个IF很明了了,last_activity + 过期时间,如果小於现在时间,表示已经超过
7200秒了,那麽就砍掉这个session。
所以,如果你每5分钟就重新整理一次,两小时的过期时间,也往後推迟5分钟!XD
单看字面上,你可能会以为是说,从本session产生後的两小时後过期,但是其实不是,
CI的session expire是指距离上次活动之後,闲置超过两小时,这才算过期。
所以你的观察的结果正确,你一直重新整理,就是不会过期的啦!XD
CI的session是server端产生一个session id,然後经过编码後,在client端写入一个
对应目前session id的cookies。
当client连进来的时候,先读取client端的cookies,查找对应的session_id,如果你
观察过client端的cookies,你只会得到一长串编码过的资讯。
CI的session过期跟更新这部份,单看字面说明,有时候会有错误的理解,翻原始码来
看最准,至於ion_auth的话,小弟没用过,我用内建的session就很很好用了,这部份
就帮不上忙了。
希望这篇可以帮助你了解CI是怎麽处理session的。
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 36.234.10.218