Re: [請益] CodeIgniter + ion_auth登入插件問題

看板PHP作者 (MoO~)時間13年前 (2012/08/24 02:28), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串2/2 (看更多)
※ 引述《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
文章代碼(AID): #1GDdOoP0 (PHP)
文章代碼(AID): #1GDdOoP0 (PHP)