您好,登錄后才能下訂單哦!
如何分析Session的生成機(jī)制、回收機(jī)制和存儲(chǔ)機(jī)制,很多新手對(duì)此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來(lái)學(xué)習(xí)下,希望你能有所收獲。
1、php中session的生成機(jī)制
我們先來(lái)分析一下PHP中是怎么生成一個(gè)session的。設(shè)計(jì)出session的目的是保持每一個(gè)用戶的各種狀態(tài)來(lái)彌補(bǔ)HTTP協(xié)議的不足(無(wú)狀態(tài))。
我們現(xiàn)在有一個(gè)疑問(wèn),我們都知道session是保存在服務(wù)器的,既然它用于保持每一個(gè)用戶的狀態(tài)那它利用什么來(lái)區(qū)別用戶的呢?這個(gè)時(shí)候就得借助cookie了。當(dāng)我們?cè)诖a中調(diào)用session_start();時(shí),PHP會(huì)同時(shí)往SESSION的存放目錄(默認(rèn)為/tmp/)和客戶端的cookie目錄各生成一個(gè)文件。session文件名稱(chēng)像這樣:
格式為sess_{SESSIONID} ,這時(shí)session文件中沒(méi)有任何內(nèi)容,當(dāng)我們?cè)趕ession_start();添加了這兩行代碼:
$_SESSION['name'] = 'phper';$_SESSION['blog'] = 'startphp.cn';
這時(shí)文件就有內(nèi)容了:
name|s:5:"phper";blog|s:11:"startphp.cn";
這時(shí)再看看cookie:
可以看到服務(wù)器為我們自動(dòng)生成了一個(gè)cookie,cookie名稱(chēng)為"PHPSESSID",cookie內(nèi)容是一串字符,其實(shí)這串字符就是{SESSIONID}。
也許你已經(jīng)明白了,當(dāng)我們使用session時(shí),PHP就先生成一個(gè)唯一的SESSIONID號(hào)(如2bd170b3f86523f1b1b60b55ffde0f66),再在我們服務(wù)器的默認(rèn)目錄下生成一個(gè)文件,文件名為sess_{SESSIONID},同時(shí)在當(dāng)前用戶的客戶端生成一個(gè)cookie,內(nèi)容已經(jīng)說(shuō)過(guò)了。這樣PHP會(huì)為每一個(gè)用戶生成一個(gè)SESSIONID,也就是說(shuō)一個(gè)用戶一個(gè)session文件。
PHP第一次為某個(gè)用戶使用session時(shí)就向客戶端寫(xiě)入了cookie,當(dāng)這個(gè)用戶以后訪問(wèn)時(shí),瀏覽器會(huì)帶上這個(gè)cookie,PHP在拿到cookie后就讀出里面的SESSIONID,拿著這個(gè)SESSIONID去session目錄下找session文件。找到后在調(diào)用$_SESSION['blog']的時(shí)候顯示出來(lái)。
2、php中session的過(guò)期回收機(jī)制
我們明白了session的生成及工作原理,發(fā)現(xiàn)在session目錄下會(huì)有許多session文件。當(dāng)然這些文件一定不是永遠(yuǎn)存在的,PHP一定提供了一種過(guò)期回收機(jī)制。在php.ini中session.gc_maxlifetime為session設(shè)置了生存時(shí)間(默認(rèn)為1440s)。如果session文件的最后更新時(shí)間到現(xiàn)在超過(guò)了生存時(shí)間,這個(gè)session文件就被認(rèn)為是過(guò)期的了。在下一次session回收的時(shí)候就會(huì)被刪除。那下一次session回收是在什么時(shí)候呢?這和php請(qǐng)求次數(shù)有關(guān)的。在PHP內(nèi)部機(jī)制中,當(dāng)php被請(qǐng)求了N次后就會(huì)有一次觸發(fā)回收機(jī)制。到底是請(qǐng)求多少次觸發(fā)一次是通過(guò)以下兩個(gè)參數(shù)控制的:
session.gc_probability = 1session.gc_divisor = 100
這是php.ini的默認(rèn)設(shè)置,意思是每100次PHP請(qǐng)求就有一次回收發(fā)生。概率是 gc_probability/gc_divisor 。我們了解了服務(wù)器端的session過(guò)期機(jī)制,再來(lái)看看客戶端的cookie的過(guò)期機(jī)制。
如果cookie失效了瀏覽器自然發(fā)送不了cookie到服務(wù)器,這時(shí)即使服務(wù)器的session文件存在也沒(méi)用,因?yàn)镻HP不知道要讀取哪個(gè)session文件。我們知道PHP的cookie過(guò)期時(shí)間是在創(chuàng)建時(shí)設(shè)置的,那么PHP在創(chuàng)建session的同時(shí)為客戶端創(chuàng)建的cookie的生命周期是多久呢?
這個(gè)在php.ini中有設(shè)置:session.cookie_lifetime 。這個(gè)值默認(rèn)是0,代表瀏覽器一關(guān)閉SESSIONID就失效。那就是說(shuō)我們把session.gc_maxlifetime和session.cookie_lifetime設(shè)置成同一個(gè)值就可以控制session的失效時(shí)間了。
3、php中session的客戶端存儲(chǔ)機(jī)制
由上面的介紹我們可以知道,如果用戶關(guān)閉了cookie,那我們的session就完全沒(méi)法工作了。是的,確實(shí)是這樣。php中session的客戶端存儲(chǔ)機(jī)制只有cookie嗎?不是的。既然我們的SESSIONID 不能通過(guò)cookie傳遞到各個(gè)頁(yè)面,那我們還有另一個(gè)法寶,就是通過(guò)頁(yè)面GET傳值的方式。
PHP可以在cookie被禁用時(shí)自動(dòng)通過(guò)GET方式跨頁(yè)傳遞SESSIONID,前提是設(shè)置php.ini的session.use_trans_sid為1。這時(shí)當(dāng)我們?cè)诳蛻舳私昧薱ookie時(shí)使用了session,并在當(dāng)前頁(yè)面通過(guò)點(diǎn)擊鏈接到另一頁(yè)面時(shí),PHP會(huì)自動(dòng)在鏈接上添加SESSIONID參數(shù),像這樣:nextpage.php?SESSIONID=2bd170b3f86523f1b1b60b55ffde0f66。
看完上述內(nèi)容是否對(duì)您有幫助呢?如果還想對(duì)相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請(qǐng)關(guān)注億速云行業(yè)資訊頻道,感謝您對(duì)億速云的支持。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。