PHP中SESSION使用中的一點(diǎn)經(jīng)驗(yàn)總結(jié)
更新時(shí)間:2012年03月30日 23:07:30 作者:
最近在網(wǎng)上的交流中發(fā)現(xiàn)大家對(duì)SESSION的使用上有很多誤區(qū),本質(zhì)上就是不了解SESSION的工作原理
SESSION會(huì)話開啟時(shí),會(huì)首先發(fā)送一個(gè)對(duì)瀏覽器的唯一標(biāo)識(shí)session_id的cookie(名字為PHPSESSID可以通過session_name()獲取),同session.save_handler = files的情況下,在服務(wù)器的指定目錄(如temp)下生成一個(gè)沒有后綴的文件,名字是
'sess_" + 'session_id';
這樣就完成了基本的設(shè)置。那么在下一次發(fā)起http請(qǐng)求時(shí),首先瀏覽器會(huì)發(fā)送這個(gè)當(dāng)前域名下的所有cookie名字和值過去,這樣服務(wù)器就能根據(jù)cookie中的session_id來(lái)去讀取session文件,而不會(huì)混淆這個(gè)session屬于誰(shuí)。
這一步具體如下:
SESSION發(fā)送一個(gè)對(duì)瀏覽器的唯一cookie變量session_id,這個(gè)session_id變量有名字、有值。變量名(name)默認(rèn)為PHPSESSID,變量值(value)為apach隨機(jī)生成的字符串,類似rvag9m368vim7k8g4v7k2ank70 。通常說的session_id其實(shí)是指這個(gè)唯一的字符串rvag9m368vim7k8g4v7k2ank70。
具體的在FF的HTTP響應(yīng)頭下如此:

session_start();
在程序中上面一句就完成了上面的功能,假如瀏覽器沒有發(fā)送PHPSESSID的cookie過來(lái)就發(fā)送一個(gè)過去,有就讀取這個(gè)cookie,這樣就能維持同一個(gè)會(huì)話。
好了既然知道了session的工作原理,那么我們可以推測(cè)到假如服務(wù)器端sess_rvag9m368vim7k8g4v7k2ank70 這個(gè)文件我們手動(dòng)刪除了,那么session失效,假如瀏覽器cookie失效,那么session照樣失效。
在手動(dòng)的情況下:
在服務(wù)器端,可以用
session_ destroy() 或者session_ unset()
來(lái)使其失效。
在瀏覽器端:
可以直接
?setcookie('PHPSESSID','',123);
讓cookie過期,或者另外一種方式,但不能立即失效
?session_set_cookie_params($time);//當(dāng)前時(shí)間戳上的秒,例如60,即讓其60秒后過期,<SPAN style="COLOR: #ff0000">不要用時(shí)間戳+自己設(shè)定的時(shí)間。 </SPAN>
上面所講的都是讓session提前過期,但是想直接讓session延遲行不行呢?除了修改配置(session.gc_maxlifetime)是不行的,在php.ini里面session.gc_maxlifetime 設(shè)置過期時(shí)間,到了這個(gè)時(shí)間,就有session.gc_probability /session.gc_divisor的概率被回收。假如到了這個(gè)時(shí)間,并且啟動(dòng)了GC進(jìn)程,GC會(huì)去讀取session文件的修改時(shí)間(mtime),發(fā)現(xiàn)大于和當(dāng)前時(shí)間相減后大于session.gc_maxlifetime ,立刻刪除。到此,我們也就明白了如何保持這個(gè)會(huì)話呢,只能在session.gc_maxlifetime 內(nèi),必須有用戶在訪問,每次訪問都去修改下session,這樣就這個(gè)session又多出session.gc_maxlifetime的存活時(shí)間。
另外說一下session.cookie_lifetime ,設(shè)置PHPSESSID在瀏覽器的存活時(shí)間,默認(rèn)為0,IE下我發(fā)現(xiàn)是正常的,瀏覽器重啟即cookie失效;FF下還繼續(xù)存在。設(shè)置session.cookie_lifetime可以用session_set_cookie_params,
?session_set_cookie_params(60);//60 s session_start();
session.gc_maxlifetime和session.cookie_lifetime 共同決定了session的生存時(shí)間。
-------------------------------------------------------------
剛剛找了一下firefox cookie會(huì)話過期的資料,發(fā)現(xiàn)如下
This is apparently by design. Check out this Bugzilla bug:https://bugzilla.mozilla.org/show_bug.cgi?id=443354
Firefox has a feature where you close Firefox and it offers to save all your tabs, and then you restore the browser and those tabs come back. That's called session restore. What I didn't realize is that it'll also restore all the session cookies for those pages too! It treats it like you had never closed the browser.
This makes sense in the sense that if your browser crashed you get right back to where you were, but is a little disconcerting for web devs used to session cookies getting cleared. I've got some old session cookies from months ago that were set by sites I always have open in tabs.
To test this out, close all the tabs in your browser, then close the browser and restart it. I think the session cookies for your site should clear in that case. Otherwise you'd have to turn off session restore.
這是火狐的會(huì)話保存功能,F(xiàn)F設(shè)計(jì)就是如此??梢宰鲞@個(gè)close all the tabs in your browser, then close the browser and restart it測(cè)試,看看是否還保存著。
復(fù)制代碼 代碼如下:
'sess_" + 'session_id';

這樣就完成了基本的設(shè)置。那么在下一次發(fā)起http請(qǐng)求時(shí),首先瀏覽器會(huì)發(fā)送這個(gè)當(dāng)前域名下的所有cookie名字和值過去,這樣服務(wù)器就能根據(jù)cookie中的session_id來(lái)去讀取session文件,而不會(huì)混淆這個(gè)session屬于誰(shuí)。
這一步具體如下:
SESSION發(fā)送一個(gè)對(duì)瀏覽器的唯一cookie變量session_id,這個(gè)session_id變量有名字、有值。變量名(name)默認(rèn)為PHPSESSID,變量值(value)為apach隨機(jī)生成的字符串,類似rvag9m368vim7k8g4v7k2ank70 。通常說的session_id其實(shí)是指這個(gè)唯一的字符串rvag9m368vim7k8g4v7k2ank70。
具體的在FF的HTTP響應(yīng)頭下如此:

session_start();
在程序中上面一句就完成了上面的功能,假如瀏覽器沒有發(fā)送PHPSESSID的cookie過來(lái)就發(fā)送一個(gè)過去,有就讀取這個(gè)cookie,這樣就能維持同一個(gè)會(huì)話。
好了既然知道了session的工作原理,那么我們可以推測(cè)到假如服務(wù)器端sess_rvag9m368vim7k8g4v7k2ank70 這個(gè)文件我們手動(dòng)刪除了,那么session失效,假如瀏覽器cookie失效,那么session照樣失效。
在手動(dòng)的情況下:
在服務(wù)器端,可以用
session_ destroy() 或者session_ unset()
來(lái)使其失效。
在瀏覽器端:
可以直接
?setcookie('PHPSESSID','',123);
讓cookie過期,或者另外一種方式,但不能立即失效
?session_set_cookie_params($time);//當(dāng)前時(shí)間戳上的秒,例如60,即讓其60秒后過期,<SPAN style="COLOR: #ff0000">不要用時(shí)間戳+自己設(shè)定的時(shí)間。 </SPAN>
上面所講的都是讓session提前過期,但是想直接讓session延遲行不行呢?除了修改配置(session.gc_maxlifetime)是不行的,在php.ini里面session.gc_maxlifetime 設(shè)置過期時(shí)間,到了這個(gè)時(shí)間,就有session.gc_probability /session.gc_divisor的概率被回收。假如到了這個(gè)時(shí)間,并且啟動(dòng)了GC進(jìn)程,GC會(huì)去讀取session文件的修改時(shí)間(mtime),發(fā)現(xiàn)大于和當(dāng)前時(shí)間相減后大于session.gc_maxlifetime ,立刻刪除。到此,我們也就明白了如何保持這個(gè)會(huì)話呢,只能在session.gc_maxlifetime 內(nèi),必須有用戶在訪問,每次訪問都去修改下session,這樣就這個(gè)session又多出session.gc_maxlifetime的存活時(shí)間。
另外說一下session.cookie_lifetime ,設(shè)置PHPSESSID在瀏覽器的存活時(shí)間,默認(rèn)為0,IE下我發(fā)現(xiàn)是正常的,瀏覽器重啟即cookie失效;FF下還繼續(xù)存在。設(shè)置session.cookie_lifetime可以用session_set_cookie_params,
?session_set_cookie_params(60);//60 s session_start();
session.gc_maxlifetime和session.cookie_lifetime 共同決定了session的生存時(shí)間。
-------------------------------------------------------------
剛剛找了一下firefox cookie會(huì)話過期的資料,發(fā)現(xiàn)如下
This is apparently by design. Check out this Bugzilla bug:https://bugzilla.mozilla.org/show_bug.cgi?id=443354
Firefox has a feature where you close Firefox and it offers to save all your tabs, and then you restore the browser and those tabs come back. That's called session restore. What I didn't realize is that it'll also restore all the session cookies for those pages too! It treats it like you had never closed the browser.
This makes sense in the sense that if your browser crashed you get right back to where you were, but is a little disconcerting for web devs used to session cookies getting cleared. I've got some old session cookies from months ago that were set by sites I always have open in tabs.
To test this out, close all the tabs in your browser, then close the browser and restart it. I think the session cookies for your site should clear in that case. Otherwise you'd have to turn off session restore.
這是火狐的會(huì)話保存功能,F(xiàn)F設(shè)計(jì)就是如此??梢宰鲞@個(gè)close all the tabs in your browser, then close the browser and restart it測(cè)試,看看是否還保存著。
相關(guān)文章
PHP實(shí)現(xiàn)模擬http請(qǐng)求的方法分析
這篇文章主要介紹了PHP實(shí)現(xiàn)模擬http請(qǐng)求的方法,簡(jiǎn)單分析了http請(qǐng)求的原理、流程及php實(shí)現(xiàn)模擬http請(qǐng)求的相關(guān)操作技巧,需要的朋友可以參考下2017-12-12使用PHP實(shí)現(xiàn)蜘蛛訪問日志統(tǒng)計(jì)
本篇文章是對(duì)使用PHP實(shí)現(xiàn)蜘蛛訪問日志統(tǒng)計(jì)的代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07如何在smarty中增加類似foreach的功能自動(dòng)加載數(shù)據(jù)
本篇文章是對(duì)在smarty中增加類似foreach的功能自動(dòng)加載數(shù)據(jù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP讀取配置文件類實(shí)例(可讀取ini,yaml,xml等)
這篇文章主要介紹了PHP讀取配置文件類,可讀取ini,yaml,xml等配置文件,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07解析:使用php mongodb擴(kuò)展時(shí) 需要注意的事項(xiàng)
本篇文章是對(duì)使用php mongodb擴(kuò)展時(shí),需要注意的事項(xiàng)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP實(shí)現(xiàn)獲取域名的方法小結(jié)
這篇文章主要介紹了PHP實(shí)現(xiàn)獲取域名的方法,實(shí)例總結(jié)了常見的獲取域名的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2014-11-11php中Session的生成機(jī)制、回收機(jī)制和存儲(chǔ)機(jī)制探究
這篇文章主要介紹了php中Session的生成機(jī)制、回收機(jī)制和存儲(chǔ)機(jī)制探究,可以幫助大家對(duì)Session有一個(gè)全面的了解,需要的朋友可以參考下2014-08-08