php30
A. PHP中設置一個嚴格30分鍾過期Session面試題的4種答案
今天在我的微博上發出一個問題:
我在面試的時候,
經常會問一個問題:
「如何設置一個30分鍾過期的Session?」,
大家不要覺得看似簡單,
這裡麵包含的知識挺多,
特別適合考察基本功是否扎實,
誰來回答試試?
呵呵
為什麼問這個問題呢?
1.我在stackoverflow上看到了有人討論這個問題
2.想起來我經常問這個問題,
所以~~
在這里,
我來解答下這個題目.
第一種回答
那麼,
最常見的一種回答是:
設置Session的過期時間,
也就是session.gc_maxlifetime,
這種回答是不正確的,
原因如下:
1.
首先,
這個PHP是用一定的概率來運行session的gc的,
也就是session.gc_probability和session.gc_divisor(介紹參看
PHP使用Session遇到的一個Permission
denied
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的默認存儲目錄,
並且手冊中也有如下的描述:
Note:
如果不同的腳本具有不同的
session.gc_maxlifetime
數值但是共享了同一個地方存儲會話數據,則具有最小數值的腳本會清理數據。此情況下,與
session.save_path
一起使用本指令。
也就是說,
如果有倆個應用都沒有指定自己獨立的save_path,
一個設置了過期時間為2分鍾(假設為A),
一個設置為30分鍾(假設為B),
那麼每次當A的Session
gc運行的時候,
就會同時刪除屬於應用B的Session
files.
所以,
第一種答案是不」完全嚴格」正確的.
第二種答案
還有一種常見的答案是:
設置Session
ID的載體,
Cookie的過期時間,
也就是session.cookie_lifetime.
這種回答也是不正確的,
原因如下:
這個過期只是Cookie過期,
換個說法這點就考察Cookie和Session的區別,
Session過期是伺服器過期,
而Cookie過期是客戶端(瀏覽器)來保證的,
即使你設置了Cookie過期,
這個只能保證標准瀏覽器到期的時候,
不會發送這個Cookie(包含著Session
ID),
而如果通過構造請求,
還是可以使用這個Session
ID的值.
第三種答案
使用memcache,
redis等,
okey,
這種答案是一種正確答案.
不過,
很顯然出題者肯定還會接著問你,
如果只是使用PHP呢?
第四種答案
當然,
面試不是為了難道你,
而是為了考察思考的周密性.
在這個過程中我會提示出這些陷阱,
所以一般來說,
符合題意的做法是:
1.
設置Cookie過期時間30分鍾,
並設置Session的lifetime也為30分鍾.
2.
自己為每一個Session值增加Time
stamp.
3.
每次訪問之前,
判斷時間戳.
最後,
有同學問,
為什麼要設置30分鍾的過期時間:
這個,
首先這是為了面試,
第二,
實際使用場景的話,
比如30分鍾就過期的優惠劵?
thanks
:)
B. PHP用今天日期計算出30天後的日期!
time()就是你現在的時間戳。
30之後就是
$time=time()+30*24*3600;
$date=date('y-m-d H:m:s',$time);
七天類似了,
$time=time()+7*24*3600;
$date=date('y-m-d H:m:s',$time);
C. PHP兩個時間段間隔30分鍾的所有時間
$time1 = '2018-01-01 01:00:00';
$time2 = '2018-01-01 11:00:00';
$buff = array();
for($i=strtotime($time1) ;$i<=strtotime($time2) ; $i=$i+60*30){
$buff[]=date("H:i:s",$i);
}
print_r($buff);
die;