PHP中設(shè)置一個嚴(yán)格30分鐘過期Session面試題的4種答案
今天在我的微博上發(fā)出一個問題:
我在面試的時候, 經(jīng)常會問一個問題: “如何設(shè)置一個30分鐘過期的Session?”, 大家不要覺得看似簡單, 這里面包含的知識挺多, 特別適合考察基本功是否扎實(shí), 誰來回答試試? 呵呵
為什么問這個問題呢?
1.我在stackoverflow上看到了有人討論這個問題
2.想起來我經(jīng)常問這個問題, 所以~~
在這里, 我來解答下這個題目.
第一種回答
那么, 最常見的一種回答是: 設(shè)置Session的過期時間, 也就是session.gc_maxlifetime, 這種回答是不正確的, 原因如下:
1. 首先, 這個PHP是用一定的概率來運(yùn)行session的gc的, 也就是session.gc_probability和session.gc_divisor(介紹參看 PHP使用Session遇到的一個Permission denied Notice解決辦法), 這個默認(rèn)的值分別是1和100, 也就是有1%的機(jī)會, PHP會在一個Session啟動時, 運(yùn)行Session gc. 不能保證到30分鐘的時候一定會過期.
2. 那設(shè)置一個大概率的清理機(jī)會呢? 還是不妥, 為什么? 因?yàn)镻HP使用stat Session文件的修改時間來判斷是否過期, 如果增大這個概率一來會降低性能, 二來, PHP使用”一個”文件來保存和一個會話相關(guān)的Session變量, 假設(shè)我5分鐘前設(shè)置了一個a=1的Session變量, 5分鐘后又設(shè)置了一個b=2的Seesion變量, 那么這個Session文件的修改時間為添加b時刻的時間, 那么a就不能在30分鐘的時候, 被清理了. 另外還有下面第三個原因.
3. PHP默認(rèn)的(Linux為例), 是使用/tmp 作為Session的默認(rèn)存儲目錄, 并且手冊中也有如下的描述:
Note: 如果不同的腳本具有不同的 session.gc_maxlifetime 數(shù)值但是共享了同一個地方存儲會話數(shù)據(jù),則具有最小數(shù)值的腳本會清理數(shù)據(jù)。此情況下,與 session.save_path 一起使用本指令。
也就是說, 如果有倆個應(yīng)用都沒有指定自己獨(dú)立的save_path, 一個設(shè)置了過期時間為2分鐘(假設(shè)為A), 一個設(shè)置為30分鐘(假設(shè)為B), 那么每次當(dāng)A的Session gc運(yùn)行的時候, 就會同時刪除屬于應(yīng)用B的Session files.
所以, 第一種答案是不”完全嚴(yán)格”正確的.
第二種答案
還有一種常見的答案是: 設(shè)置Session ID的載體, Cookie的過期時間, 也就是session.cookie_lifetime. 這種回答也是不正確的, 原因如下:
這個過期只是Cookie過期, 換個說法這點(diǎn)就考察Cookie和Session的區(qū)別, Session過期是服務(wù)器過期, 而Cookie過期是客戶端(瀏覽器)來保證的, 即使你設(shè)置了Cookie過期, 這個只能保證標(biāo)準(zhǔn)瀏覽器到期的時候, 不會發(fā)送這個Cookie(包含著Session ID), 而如果通過構(gòu)造請求, 還是可以使用這個Session ID的值.
第三種答案
使用memcache, redis等, okey, 這種答案是一種正確答案. 不過, 很顯然出題者肯定還會接著問你, 如果只是使用PHP呢?
第四種答案
當(dāng)然, 面試不是為了難道你, 而是為了考察思考的周密性. 在這個過程中我會提示出這些陷阱, 所以一般來說, 符合題意的做法是:
1. 設(shè)置Cookie過期時間30分鐘, 并設(shè)置Session的lifetime也為30分鐘.
2. 自己為每一個Session值增加Time stamp.
3. 每次訪問之前, 判斷時間戳.
最后, 有同學(xué)問, 為什么要設(shè)置30分鐘的過期時間: 這個, 首先這是為了面試, 第二, 實(shí)際使用場景的話, 比如30分鐘就過期的優(yōu)惠劵?
thanks :)
相關(guān)文章
Zend Framework教程之模型Model基本規(guī)則和使用方法
這篇文章主要介紹了Zend Framework教程之模型Model基本規(guī)則和使用方法,結(jié)合實(shí)例形式詳細(xì)分析了Zend Framework中模型的原理與具體使用技巧,需要的朋友可以參考下2016-03-03全新的PDO數(shù)據(jù)庫操作類php版(僅適用Mysql)
在公司里也用了1年之久。如今公司規(guī)模變大了,產(chǎn)品也日益完善,曾經(jīng)的那個數(shù)據(jù)庫操作函數(shù)雖說使用上沒出什么大問題,但為了更顯專業(yè),花了1天時間重寫了這個,現(xiàn)在,它確實(shí)是個類了2012-07-07tp5.1 框架數(shù)據(jù)庫-數(shù)據(jù)集操作實(shí)例分析
這篇文章主要介紹了tp5.1 框架數(shù)據(jù)庫-數(shù)據(jù)集操作,結(jié)合實(shí)例形式分析了tp5.1 框架數(shù)據(jù)庫查詢結(jié)果數(shù)據(jù)集獲取、遍歷相關(guān)操作技巧與使用注意事項(xiàng),需要的朋友可以參考下2020-05-05laravel model模型定義實(shí)現(xiàn)開啟自動管理時間created_at,updated_at
今天小編就為大家整理了一篇laravel model模型定義實(shí)現(xiàn)開啟自動管理時間created_at,updated_at,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-10-10基于ThinkPHP5.0實(shí)現(xiàn)圖片上傳插件
thinkphp5.0 圖片上傳插件可預(yù)覽裁剪圖片和保存原圖片,執(zhí)行裁剪圖片后會刪除 裁剪的原圖片目錄,以便減少空間。具體實(shí)現(xiàn)代碼大家參考下本文2017-09-09