首先說(shuō)一下session的創(chuàng)建的開始到結(jié)束的過(guò)程。
當(dāng)程序需要為某個(gè)客戶端的請(qǐng)求創(chuàng)建一個(gè) session 的時(shí)候,服務(wù)器首先會(huì)檢查這個(gè)客戶端是否已經(jīng)包含了一個(gè) session 標(biāo)識(shí),這個(gè)我們稱為 session id(獲取方法為 session_id() ),如果已包含一個(gè) session id 則說(shuō)明此客戶端之前已經(jīng)創(chuàng)建過(guò) session,服務(wù)器則按照 session id 把這個(gè) session 中的值檢索出來(lái),如果客戶端不包含 session id,說(shuō)明此客戶端第一次請(qǐng)求服務(wù)器或手動(dòng)清除過(guò)緩存文件,則為此客戶端創(chuàng)建一個(gè) session 并且生成一個(gè)與此 session 相關(guān)聯(lián)的 session id,一般來(lái)說(shuō),session id 的值是不會(huì)重復(fù)的,并且加密的字符串,這個(gè) session id 將被在本次響應(yīng)中返回給客戶端保存。
session 在何時(shí)被創(chuàng)建 ?
通常(是指通常)是在瀏覽器向服務(wù)器端第一次請(qǐng)求時(shí)被創(chuàng)建,并且它會(huì)占用一定的內(nèi)存空間,因此在不必要的情況下,盡最關(guān)閉 session 。
session 何時(shí)被刪除 ?
通常情況下,session 在會(huì)在這幾種情況下被刪除:
一是使用 session_destroy() 重置函數(shù)手動(dòng)刪除;
二是 session 的上次活動(dòng)時(shí)間距離當(dāng)前時(shí)間的間隔超過(guò)了 session 的超時(shí)設(shè)置的時(shí)間;三是服務(wù)器進(jìn)程被停止。
怎么在瀏覽器關(guān)閉時(shí)刪除 session ?
理論上來(lái)說(shuō),是做不到這一點(diǎn),http是一種無(wú)狀態(tài)協(xié)議,因此服務(wù)器不知道客戶端什么時(shí)候關(guān)掉的瀏覽器,并且PHP也沒(méi)有一個(gè)關(guān)相的函數(shù)來(lái)獲取此項(xiàng)信息,但這個(gè)問(wèn)題還可以得到解決,就是使用 網(wǎng)頁(yè)特效 代碼 window.oncolose 來(lái)監(jiān)視瀏覽器的關(guān)閉動(dòng)作,然后用Ajax向服務(wù)器端發(fā)送一個(gè)請(qǐng)求來(lái)刪除 session ,但這個(gè)辦法也并不會(huì)完全解決問(wèn)題,原因是在有些情況下比如瀏覽器崩潰、突然斷電、用戶死機(jī)等這些時(shí)候并不能作出反應(yīng)。
如何設(shè)置使session在一段時(shí)間過(guò)后自動(dòng)失效(刪除)?
session_start()是session機(jī)制的開始,它有一定概率開啟垃圾回收,因?yàn)閟ession是存放在文件中,PHP自身的垃圾回收是無(wú)效的,SESSION的回收(刪除)是要?jiǎng)h文件的,這個(gè)概率是根據(jù)php.ini的配置決定的,但是有的系統(tǒng)是 session.gc_probability = 0,這也就是說(shuō)概率是0,而是通過(guò)cron腳本來(lái)實(shí)現(xiàn)垃圾回收(即刪除session)。
PHP中的session有效期默認(rèn)是1440秒(24分鐘,注:php5里默認(rèn)的是180分】,也就是說(shuō),客戶端超過(guò)24分鐘沒(méi)有刷新,當(dāng)前session就會(huì)失效。很明顯,這是不能滿足需要的。
一個(gè)已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存儲(chǔ)到數(shù)據(jù)庫(kù),這樣可以通過(guò)SQL語(yǔ)句來(lái)刪除所有過(guò)期的session,精確地控制session的有效期。這也是基于PHP的大型網(wǎng)站常用的方法。但是,一般的小型網(wǎng)站,似乎沒(méi)有必要這么勞師動(dòng)眾。
但是一般的Session的生命期有限,如果用戶關(guān)閉了瀏覽器,就不能保存Session的變量了!那么怎么樣可以實(shí)現(xiàn)Session的永久生命期呢?
新聞熱點(diǎn)
疑難解答
圖片精選