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