深度解析 Session 機(jī)制

Session 存儲(chǔ)方式

在 php.ini 文件中挪蹭,進(jìn)行配置。

  • session.save_handler = files
  • session.save_path = "N;MODE;/tmp"

這兩個(gè)參數(shù)可以在 PHP 中通過(guò) ini_set 來(lái)設(shè)置固逗,不用直接覆蓋原 php.ini 中的值。

注釋

  • N 表示多級(jí)目錄,值為數(shù)字嘉赎。
  • MODE 表示創(chuàng)建的 Session 文件權(quán)限。
  • /tmp 表示 Session 存儲(chǔ)路徑于樟。

PHP官網(wǎng)的解釋:

此指令還有一個(gè)可選的 N 參數(shù)來(lái)決定會(huì)話文件分布的目錄深度公条。
例如,設(shè)定為 '5;/tmp' 將使創(chuàng)建的會(huì)話文件和路徑類似于 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If迂曲。
要使用 N 參數(shù)靶橱,必須在使用前先創(chuàng)建好這些目錄。
在 ext/session 目錄下有個(gè)小的 shell 腳本名叫 mod_files.sh路捧,windows 版本是 mod_files.bat 可以用來(lái)做這件事关霸。
此外注意如果使用了 N 參數(shù)并且大于 0,那么將不會(huì)執(zhí)行自動(dòng)垃圾回收鬓长,更多信息見(jiàn) php.ini谒拴。
另外如果用了 N 參數(shù),要確保將 session.save_path 的值用雙引號(hào) "quotes" 括起來(lái)涉波,因?yàn)榉指舴痔?hào)( ;)在 php.ini 中也是注釋符號(hào)英上。
文件儲(chǔ)存模塊默認(rèn)使用 mode 600 創(chuàng)建文件炭序。
通過(guò) 修改可選參數(shù) MODE 來(lái)改變這種默認(rèn)行為: N;MODE;/path ,其中 MODE 是 mode 的八進(jìn)制表示苍日。 
MODE 設(shè)置不影響進(jìn)程的掩碼(umask)惭聂。
Caution:使用以上描述的可選目錄層級(jí)參數(shù) N 時(shí)請(qǐng)注意,對(duì)于絕大多數(shù)站點(diǎn)相恃,
大于1或者2的值會(huì)不太合適——因?yàn)檫@需要?jiǎng)?chuàng)建大量的目錄:例如辜纲,值設(shè)置為 3 需要在文件系統(tǒng)上創(chuàng)建 64^3 個(gè)目錄,將浪費(fèi)很多空間和 inode拦耐。
僅僅在絕對(duì)肯定站點(diǎn)足夠大時(shí)耕腾,才可以設(shè)置 N 大于2。

Session 生命周期

第一種是通過(guò)程序

  • session_destory()方法清除所有session
  • unset(session['x'])來(lái)清除指定的session['x']杀糯。

第二種是通過(guò)編輯瀏覽器

  • 關(guān)閉后會(huì)直接清除所有session

問(wèn)題:如何改變Session生命周期扫俺?

Session 垃圾回收機(jī)制

  • session.gc_maxlifetime
  • session.gc_probability
  • session.gc_divisor

Garbage Collection 垃圾回收:

session.gc_divisor 與 session.gc_probability 合起來(lái)定義了在每個(gè)會(huì)話初始化時(shí)啟動(dòng) GC 進(jìn)程的概率。

此概率用 gc_probability/gc_divisor 計(jì)算得來(lái)固翰。例如 1/1000 意味著在每個(gè)請(qǐng)求中有 0.1% 的概率啟動(dòng) GC 進(jìn)程狼纬。

GC的工作,就是掃描所有的session信息骂际, 用當(dāng)前時(shí)間減去session的最后修改時(shí)間(modified date)疗琉,同session.gc_maxlifetime參數(shù)進(jìn)行比較,

如果生存時(shí)間已經(jīng)超過(guò)gc_maxlifetime歉铝,就把該session刪除盈简。 

Session 共享

  • Redis [分布式]
  • Memcache [分布式]

以Memcache 為例:

多臺(tái)機(jī)器共用一個(gè) memcache 這樣的好處,就是在并發(fā)大訪問(wèn)的情況下太示,還能防止單臺(tái)機(jī)器送火,因?yàn)榉磸?fù)創(chuàng)建和打開(kāi)SESSION文件,造成的IO壓力先匪,之前測(cè)試過(guò)种吸,對(duì)于緩實(shí)IO壓力很有效。

//配置 php.ini呀非,配置后記得重啟
//memcache Ip(127.0.0.1) Port(11211) 
session.save_handler = memcache
session.save_path = "tcp://127.0.0.1:11211"
//set_session.php
session_start();
$_SESSION['name'] = 'Bihu';
print $_SESSION['name'];
print "<br>";
print session_id();

//運(yùn)行后輸出 
//Bihu
//9325ag3rvunvhl7c2pfd3u27n0
//表示:Session 存儲(chǔ)成功
//get_session.php
$memcache = new Memcache();
$memcache->connect('127.0.0.1', 11211);
$data = $memcache->get('9325ag3rvunvhl7c2pfd3u27n0');
print $data;

//運(yùn)行后輸出
//name|s:4:"Bihu"; (解析數(shù)據(jù)即可[首先要先了解Session數(shù)據(jù)結(jié)構(gòu)])
//表示:Session 獲取成功
//附上解析數(shù)據(jù)方法
function unserialize_php($session_data) 
{    
    $return_data = array();    
    $offset = 0;    
    while ($offset < strlen($session_data)) {        
        if (!strstr(substr($session_data, $offset), "|")) {            
            throw new Exception("invalid data, remaining: " .substr($session_data, $offset));        
        }        
        $pos = strpos($session_data, "|", $offset);        
        $num = $pos - $offset;        
        $varname = substr($session_data, $offset, $num);
        $offset += $num + 1;        
        $data = unserialize(substr($session_data, $offset));
        $return_data[$varname] = $data;        
        $offset += strlen(serialize($data));    
    }    
    return $return_data;
}
$un_data = unserialize_php($data);
echo '<pre>';
var_dump(unserialize_php($un_data));

//輸出數(shù)據(jù)
//array(1) {
//    ["name"]=>
//    string(4) "Bihu"
//}

Thanks ~

問(wèn)題:如何改變Session生命周期坚俗?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市岸裙,隨后出現(xiàn)的幾起案子猖败,更是在濱河造成了極大的恐慌,老刑警劉巖降允,帶你破解...
    沈念sama閱讀 216,997評(píng)論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件恩闻,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡剧董,警方通過(guò)查閱死者的電腦和手機(jī)幢尚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門破停,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尉剩,你說(shuō)我怎么就攤上這事真慢。” “怎么了理茎?”我有些...
    開(kāi)封第一講書人閱讀 163,359評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵黑界,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我皂林,道長(zhǎng)朗鸠,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 58,309評(píng)論 1 292
  • 正文 為了忘掉前任础倍,我火速辦了婚禮童社,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘著隆。我一直安慰自己,他們只是感情好呀癣,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,346評(píng)論 6 390
  • 文/花漫 我一把揭開(kāi)白布美浦。 她就那樣靜靜地躺著,像睡著了一般项栏。 火紅的嫁衣襯著肌膚如雪浦辨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,258評(píng)論 1 300
  • 那天沼沈,我揣著相機(jī)與錄音流酬,去河邊找鬼。 笑死列另,一個(gè)胖子當(dāng)著我的面吹牛芽腾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播页衙,決...
    沈念sama閱讀 40,122評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼摊滔,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了店乐?” 一聲冷哼從身側(cè)響起艰躺,我...
    開(kāi)封第一講書人閱讀 38,970評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎眨八,沒(méi)想到半個(gè)月后腺兴,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,403評(píng)論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡廉侧,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,596評(píng)論 3 334
  • 正文 我和宋清朗相戀三年页响,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篓足。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,769評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拘泞,死狀恐怖纷纫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陪腌,我是刑警寧澤辱魁,帶...
    沈念sama閱讀 35,464評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站诗鸭,受9級(jí)特大地震影響染簇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜强岸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,075評(píng)論 3 327
  • 文/蒙蒙 一锻弓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蝌箍,春花似錦青灼、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,705評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至悯衬,卻和暖如春弹沽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背筋粗。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,848評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工策橘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人娜亿。 一個(gè)月前我還...
    沈念sama閱讀 47,831評(píng)論 2 370
  • 正文 我出身青樓丽已,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親买决。 傳聞我的和親對(duì)象是個(gè)殘疾皇子促脉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,678評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1、memcache的概念策州? Memcache是一個(gè)高性能的分布式的內(nèi)存對(duì)象緩存系統(tǒng)瘸味,通過(guò)在內(nèi)存里維護(hù)一個(gè)統(tǒng)一的巨...
    桖辶殤閱讀 2,235評(píng)論 2 12
  • 在網(wǎng)站使用nginx+php做負(fù)載均衡情況下,同一個(gè)IP訪問(wèn)同一個(gè)頁(yè)面會(huì)被分配到不同的服務(wù)器上够挂,如果session...
    dreamer_lk閱讀 1,026評(píng)論 2 9
  • 一旁仿、MemCache簡(jiǎn)介 session MemCache是一個(gè)自由、源碼開(kāi)放、高性能枯冈、分布式的分布式內(nèi)存對(duì)象緩存...
    李偉銘MIng閱讀 3,810評(píng)論 2 13
  • Session的聲明與使用 Session的設(shè)置不同于Cookie毅贮,必須先啟動(dòng),在PHP中必須調(diào)用session_...
    尋回驕傲閱讀 2,949評(píng)論 0 18
  • 還是從法國(guó)留學(xué)開(kāi)始說(shuō)起尘奏,我相信滩褥,每個(gè)在國(guó)外留學(xué)的朋友,遇到的最大的困難根本不是生活上的炫加,那只是一個(gè)非常小的事情而已...
    流動(dòng)盛宴愛(ài)碼士閱讀 551評(píng)論 0 7