久久无码中文字幕_日韩精品无码一本二本三_久久精品呦女暗网_欧美一级夜夜爽_久久精品国产99久久99久久久

03
2018/08

PHP 項目實(shí)戰(zhàn)開發(fā)中,Session的原理及最佳實(shí)踐

發(fā)布時間:2018-08-03 18:21:04
發(fā)布者:pengyifeng
瀏覽量:
0

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)一些基本的方法。

session簡介.jpg

Session的過期問題

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的有效期


關(guān)鍵詞:
返回列表