如何設置一個嚴格30分鐘過時的Session

第一種回答面試

那麼, 最多見的一種回答是: 設置Session的過時時間, 也就是session.gc_maxlifetime, 這種回答是不正確的, 緣由以下:redis

  1. 首先, 這個PHP是用必定的機率來運行session的gc的, 也就是session.gc_probability和session.gc_divisor(介紹參看 深刻理解PHP原理之Session Gc的一個小几率Notice), 這個默認的值分別是1和100, 也就是有1%的機會, PHP會在一個Session啓動時, 運行Session gc. 不能保證到30分鐘的時候必定會過時.瀏覽器

  2. 那設置一個大機率的清理機會呢? 仍是不妥, 爲何? 由於PHP使用stat Session文件的修改時間來判斷是否過時, 若是增大這個機率一來會下降性能, 二來, PHP使用」一個」文件來保存和一個會話相關的Session變量, 假設我5分鐘前設置了一個a=1的Session變量, 5分鐘後又設置了一個b=2的Seesion變量, 那麼這個Session文件的修改時間爲添加b時刻的時間, 那麼a就不能在30分鐘的時候, 被清理了. 另外還有下面第三個緣由.服務器

  3. PHP默認的(Linux爲例), 是使用/tmp 做爲Session的默認存儲目錄, 而且手冊中也有以下的描述:cookie

    Note: 若是不一樣的腳本具備不一樣的 session.gc_maxlifetime 數值可是共享了同一個地方存儲會話數據,則具備最小數值的腳本會清理數據。此狀況下,與 session.save_path 一塊兒使用本指令。

也就是說, 若是有倆個應用都沒有指定本身獨立的save_path, 一個設置了過時時間爲2分鐘(假設爲A), 一個設置爲30分鐘(假設爲B), 那麼每次當A的Session gc運行的時候, 就會同時刪除屬於應用B的Session files.session

因此, 第一種答案是不」徹底嚴格」正確的.
第二種答案性能

還有一種常見的答案是: 設置Session ID的載體, Cookie的過時時間, 也就是session.cookie_lifetime. 這種回答也是不正確的, 緣由以下:code

這個過時只是Cookie過時, 換個說法這點就考察Cookie和Session的區別, Session過時是服務器過時, 而Cookie過時是客戶端(瀏覽器)來保證的, 即便你設置了Cookie過時, 這個只能保證標準瀏覽器到期的時候, 不會發送這個Cookie(包含着Session ID), 而若是經過構造請求, 仍是可使用這個Session ID的值.
第三種答案it

使用memcache, redis等, okey, 這種答案是一種正確答案. 不過, 很顯然出題者確定還會接着問你, 若是隻是使用PHP呢?
第四種答案io

固然, 面試不是爲了難道你, 而是爲了考察思考的周密性. 在這個過程當中我會提示出這些陷阱, 因此通常來講, 符合題意的作法是:

  1. 設置Cookie過時時間30分鐘, 並設置Session的lifetime也爲30分鐘.

  2. 本身爲每個Session值增長Time stamp.

  3. 每次訪問以前, 判斷時間戳.

相關文章
相關標籤/搜索