當前位置:首頁 » 編程語言 » php30

php30

發布時間: 2023-09-03 20:05:27

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;

熱點內容
滑板鞋腳本視頻 發布:2025-02-02 09:48:54 瀏覽:433
群暉怎麼玩安卓模擬器 發布:2025-02-02 09:45:23 瀏覽:558
三星安卓12彩蛋怎麼玩 發布:2025-02-02 09:44:39 瀏覽:744
電腦顯示連接伺服器錯誤 發布:2025-02-02 09:24:10 瀏覽:537
瑞芯微開發板編譯 發布:2025-02-02 09:22:54 瀏覽:147
linux虛擬機用gcc編譯時顯示錯誤 發布:2025-02-02 09:14:01 瀏覽:240
java駝峰 發布:2025-02-02 09:13:26 瀏覽:652
魔獸腳本怎麼用 發布:2025-02-02 09:10:28 瀏覽:538
linuxadobe 發布:2025-02-02 09:09:43 瀏覽:212
sql2000資料庫連接 發布:2025-02-02 09:09:43 瀏覽:726