Session 的原理
session是在服務(wù)器端存儲(chǔ)數(shù)據(jù)的一種方法,對(duì)應(yīng)的cookie是在客戶端保持用戶數(shù)據(jù)。為了在客戶端(比如瀏覽器)可以跨頁(yè)面交流數(shù)據(jù),Netscape將cookie引入瀏覽器。所以,cookie是保存在瀏覽器端的。
服務(wù)器是如何來(lái)找到對(duì)應(yīng)的sessionne呢,是使用全局變量$_COOKIE。所以說(shuō),服務(wù)器在接到(request)的時(shí)候通過(guò)這個(gè)$_COOKIE獲取客戶端的數(shù)據(jù),然后又$_COOKIE來(lái)跟客戶端交流,將數(shù)據(jù)傳到客服端;相對(duì)于客戶端來(lái)說(shuō),通過(guò)$_COOKIE將想要存儲(chǔ)的數(shù)據(jù)發(fā)送給客戶端存儲(chǔ),需要取出數(shù)據(jù)的時(shí)候,通過(guò)這個(gè)session來(lái)向服務(wù)器取數(shù)據(jù),很方便的使用方法,但是cookie是有時(shí)效的所以說(shuō)session也是有時(shí)效的。
那么客戶端如何記錄這么多的數(shù)據(jù)呢?首先就是需要瀏覽器跟服務(wù)器建立數(shù)據(jù)傳輸關(guān)系,使得每個(gè)客戶端都要一個(gè)唯一標(biāo)示,這樣,服務(wù)器才能識(shí)別出來(lái)。建立唯一標(biāo)識(shí)的方法是通過(guò)cookie或者通過(guò)GET方式在服務(wù)端建立session。php在使用session的時(shí)候,默認(rèn)的會(huì)建立一個(gè)名叫"PHPSESSID"的cookie,值是唯一的,并在某個(gè)目錄下保存一個(gè)文件(文件名唯一由剛剛生成的那個(gè)cookie決定),然后發(fā)送給客戶端,客戶端在再次發(fā)送請(qǐng)求的時(shí)候,就會(huì)把這個(gè)名叫"PHPSESSID"的cookie帶過(guò)來(lái),也就是$_COOKIE["PHPSESSID"],這個(gè)cookie的值不是session本身,而是一個(gè)session_id,一個(gè)和客戶端一一對(duì)應(yīng)的id。
需要注意的是:
PHPSESSID這個(gè)名稱是可以配置的
ession保存的位置也是可以配置的通過(guò)php.ini中session.save_path設(shè)置,甚至,可以通過(guò)別的方式保存在數(shù)據(jù)庫(kù)或者緩存中
在存session時(shí)限序列化,讀取的時(shí)候,先反序列化
這就是session的實(shí)現(xiàn)機(jī)制和原理。在機(jī)制不變的情況下,每個(gè)環(huán)節(jié)的實(shí)現(xiàn)方式幾乎都可以自定義。比如可以在這些方面實(shí)現(xiàn)自定義:
如果客戶端不支持cookie,你也可以通過(guò)GET方式將session id發(fā)送到服務(wù)端
如果你想改變唯一session_id的生成方式,你也可以選擇用uniqid
你也可以改變session存放的路徑
可以改變session文件的前綴,后綴
甚至你可以把session存在數(shù)據(jù)庫(kù),緩存當(dāng)中
要想將session保存在別的媒介(比如緩存)需要先介紹一個(gè)接口:SessionHandlerInterface
可以通過(guò)實(shí)現(xiàn)這個(gè)接口,來(lái)自定義session的存貯方式,比如數(shù)據(jù)庫(kù)。當(dāng)然,要實(shí)現(xiàn)一些基本的方法。
ini_set('session.gc_maxlifetime', 3600); //設(shè)置時(shí)間 ini_get('session.gc_maxlifetime');//得到ini中設(shè)定值
超過(guò)這個(gè)gc_maxlifetime時(shí)間,session會(huì)被認(rèn)為是garbage,有垃圾就有垃圾回收,但是垃圾回收的檢查卻不是每次都進(jìn)行,而是按照一個(gè)幾率,分別是這兩個(gè)參數(shù):
session.gc_probability = 1 session.gc_divisor = 1000
客戶端方面
主要和cookie的過(guò)期時(shí)間有關(guān)。php.ini中通過(guò)session.name = PHPSESSID來(lái)保存session的cookie名字默認(rèn)為PHPSESSID(可以修改),那么可以設(shè)定這個(gè)cookie的過(guò)期時(shí)間來(lái)實(shí)現(xiàn)session的過(guò)期。
session.use_cookies = 1;
把這個(gè)的值設(shè)置為1,利用cookie來(lái)傳遞sessionid;
session.cookie_lifetime = 0
這個(gè)代表SessionID在客戶端Cookie儲(chǔ)存的時(shí)間,默認(rèn)是0,代表瀏覽器一關(guān)閉sessionid就作廢。如果想使得PHPSESSID cookie永久有效,這個(gè)可以設(shè)為一個(gè)很大的值如999999999。另外也可以通過(guò)session_set_cookie_params()函數(shù)來(lái)設(shè)定PHPSESSID cookie的有效期