Re: [請益] CodeIgniter + ion_auth登入插件問題
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 2 篇):
PHP 近期熱門文章
PTT數位生活區 即時熱門文章