溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

什么是Session機制

發(fā)布時間:2021-07-14 15:06:59 來源:億速云 閱讀:179 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“什么是Session機制”,在日常操作中,相信很多人在什么是Session機制問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是Session機制”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!

什么是Session機制

Session 存儲方式

在 php.ini 文件中,進行配置。

session.save_handler = files

session.save_path = "N;MODE;/tmp"

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

注釋:

N 表示多級目錄,值為數(shù)字。

MODE 表示創(chuàng)建的 Session 文件權(quán)限。

/tmp 表示 Session 存儲路徑。

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

此指令還有一個可選的 N 參數(shù)來決定會話文件分布的目錄深度。

例如,設(shè)定為 '5;/tmp' 將使創(chuàng)建的會話文件和路徑類似于 /tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If。

要使用 N 參數(shù),必須在使用前先創(chuàng)建好這些目錄。

在 ext/session 目錄下有個小的 shell 腳本名叫 mod_files.sh,windows 版本是 mod_files.bat 可以用來做這件事。

此外注意如果使用了 N 參數(shù)并且大于 0,那么將不會執(zhí)行自動垃圾回收,更多信息見 php.ini。

另外如果用了 N 參數(shù),要確保將 session.save_path 的值用雙引號 "quotes" 括起來,因為分隔符分號( ;)在 php.ini 中也是注釋符號。

文件儲存模塊默認(rèn)使用 mode 600 創(chuàng)建文件。

通過 修改可選參數(shù) MODE 來改變這種默認(rèn)行為: N;MODE;/path ,其中 MODE 是 mode 的八進制表示。 

MODE 設(shè)置不影響進程的掩碼(umask)。

Caution:使用以上描述的可選目錄層級參數(shù) N 時請注意,對于絕大多數(shù)站點,

大于1或者2的值會不太合適——因為這需要創(chuàng)建大量的目錄:例如,值設(shè)置為 3 需要在文件系統(tǒng)上創(chuàng)建 64^3 個目錄,將浪費很多空間和 inode。

僅僅在絕對肯定站點足夠大時,才可以設(shè)置 N 大于2。

Session 生命周期

1. 第一種是通過程序

session_destory()方法清除所有session

unset(session['x'])來清除指定的session['x']。

2. 第二種是通過編輯瀏覽器

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

Session 垃圾回收機制

session.gc_maxlifetime

session.gc_probability

session.gc_divisor

Garbage Collection 垃圾回收:

session.gc_divisor 與 session.gc_probability 合起來定義了在每個會話初始化時啟動 GC 進程的概率。

此概率用 gc_probability/gc_divisor 計算得來。例如 1/1000 意味著在每個請求中有 0.1% 的概率啟動 GC 進程。

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

如果生存時間已經(jīng)超過gc_maxlifetime,就把該session刪除。

Session 共享

1. Redis [分布式]

2. Memcache [分布式]

以Memcache 為例:

多臺機器共用一個 memcache 這樣的好處,就是在并發(fā)大訪問的情況下,還能防止單臺機器,因為反復(fù)創(chuàng)建和打開SESSION文件,造成的IO壓力,之前測試過,對于緩實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();

//運行后輸出 

//Bihu

//9325ag3rvunvhl7c2pfd3u27n0

//表示:Session 存儲成功

//get_session.php

$memcache = new Memcache();

$memcache->connect('127.0.0.1', 11211);

$data = $memcache->get('9325ag3rvunvhl7c2pfd3u27n0');

print $data;

//運行后輸出

//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"

//}

到此,關(guān)于“什么是Session機制”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注億速云網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI