今天在我的微博(Laruence)上發(fā)出一個(gè)問(wèn)題:
為什么問(wèn)這個(gè)問(wèn)題呢? 1. 我在Twitter上看到了有人討論這個(gè)問(wèn)題, 2 想起來(lái)我經(jīng)常問(wèn)這個(gè)問(wèn)題, 所以~~ 在這里, 我來(lái)解答下這個(gè)題目. 第一種回答那么, 最常見的一種回答是: 設(shè)置Session的過(guò)期時(shí)間, 也就是session.gc_maxlifetime, 這種回答是不正確的, 原因如下: 1. 首先, 這個(gè)PHP是用一定的概率來(lái)運(yùn)行session的gc的, 也就是session.gc_probability和session.gc_divisor(介紹參看深入理解PHP原理之Session Gc的一個(gè)小概率Notice), 這個(gè)默認(rèn)的值分別是1和100, 也就是有1%的機(jī)會(huì), PHP會(huì)在一個(gè)Session啟動(dòng)時(shí), 運(yùn)行Session gc. 不能保證到30分鐘的時(shí)候一定會(huì)過(guò)期. 2. 那設(shè)置一個(gè)大概率的清理機(jī)會(huì)呢? 還是不妥, 為什么? 因?yàn)镻HP使用stat Session文件的修改時(shí)間來(lái)判斷是否過(guò)期, 如果增大這個(gè)概率一來(lái)會(huì)降低性能, 二來(lái), PHP使用”一個(gè)”文件來(lái)保存和一個(gè)會(huì)話相關(guān)的Session變量, 假設(shè)我5分鐘前設(shè)置了一個(gè)a=1的Session變量, 5分鐘后又設(shè)置了一個(gè)b=2的Seesion變量, 那么這個(gè)Session文件的修改時(shí)間為添加b時(shí)刻的時(shí)間, 那么a就不能在30分鐘的時(shí)候, 被清理了. 另外還有下面第三個(gè)原因. 3. PHP默認(rèn)的(Linux為例), 是使用/tmp 作為Session的默認(rèn)存儲(chǔ)目錄, 并且手冊(cè)中也有如下的描述:
也就是說(shuō), 如果有倆個(gè)應(yīng)用都沒有指定自己獨(dú)立的save_path, 一個(gè)設(shè)置了過(guò)期時(shí)間為2分鐘(假設(shè)為A), 一個(gè)設(shè)置為30分鐘(假設(shè)為B), 那么每次當(dāng)A的Session gc運(yùn)行的時(shí)候, 就會(huì)同時(shí)刪除屬于應(yīng)用B的Session files. 所以, 第一種答案是不”完全嚴(yán)格”正確的. 第二種答案還有一種常見的答案是: 設(shè)置Session ID的載體, Cookie的過(guò)期時(shí)間, 也就是session.cookie_lifetime. 這種回答也是不正確的, 原因如下: 這個(gè)過(guò)期只是Cookie過(guò)期, 換個(gè)說(shuō)法這點(diǎn)就考察Cookie和Session的區(qū)別, Session過(guò)期是服務(wù)器過(guò)期, 而Cookie過(guò)期是客戶端(瀏覽器)來(lái)保證的, 即使你設(shè)置了Cookie過(guò)期, 這個(gè)只能保證標(biāo)準(zhǔn)瀏覽器到期的時(shí)候, 不會(huì)發(fā)送這個(gè)Cookie(包含著Session ID), 而如果通過(guò)構(gòu)造請(qǐng)求, 還是可以使用這個(gè)Session ID的值. 第三種答案使用memcache, redis等, okey, 這種答案是一種正確答案. 不過(guò), 很顯然出題者肯定還會(huì)接著問(wèn)你, 如果只是使用PHP呢? 第四種答案當(dāng)然, 面試不是為了難道你, 而是為了考察思考的周密性. 在這個(gè)過(guò)程中我會(huì)提示出這些陷阱, 所以一般來(lái)說(shuō), 符合題意的做法是: 1. 設(shè)置Cookie過(guò)期時(shí)間30分鐘, 并設(shè)置Session的lifetime也為30分鐘. 2. 自己為每一個(gè)Session值增加Time stamp. 3. 每次訪問(wèn)之前, 判斷時(shí)間戳. 最后, 有同學(xué)問(wèn), 為什么要設(shè)置30分鐘的過(guò)期時(shí)間: 這個(gè), 首先這是為了面試, 第二, 實(shí)際使用場(chǎng)景的話, 比如30分鐘就過(guò)期的優(yōu)惠劵? thanks Related Posts: |
|