帶你深度解析php的Session機制

字號+ 編輯: 国内TP粉 修訂: 种花家 來源: ThinkPHP 2023-09-22 我要說兩句(0)

本篇帶你深度解析php的 Session 機制。

Session 存儲方式

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

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

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

注釋:

N 表示多級目錄,值爲數字。

MODE 表示創建的 Session 文档權限。

/tmp 表示 Session 存儲路徑。

PHP官網的解釋:

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

例如,設定爲 '5;/tmp' 將使創建的會話文档和路徑類似於

/tmp/4/b/1/e/3/sess_4b1e384ad74619bd212e236e52a5a174If

要使用 N 參數,必須在使用前先創建好這些目錄。

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

此外注意如果使用了 N 參數並且大於 0,那麽將不會執行自動垃圾回收,更多信息見 php.ini。另外如果用了 N 參數,要確保將 session.save_path 的值用雙引號 "quotes" 括起來,因爲分隔符分號( ;)在 php.ini 中也是注釋符號。

文档儲存模塊默認使用 mode 600 創建文档。

通過修改可選參數 MODE 來改變這種默認行爲: N;MODE;/path ,其中 MODE 是 mode 的八進制表示。

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

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

大於1或者2的值會不太合適——因爲這需要創建大量的目錄:例如,值設置爲 3 需要在文档系統上創建 64^3 個目錄,將浪費很多空間和 inode。

僅僅在絕對肯定站點足夠大時,才可以設置 N 大於2。

Session 生命周期

1. 第一種是通過程序

session_destory()

這個php自帶的函數可以清除所有php自帶機制生成的session

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

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

關閉後會直接清除所有session。

Session 垃圾回收機制session.gc_maxlifetime

session.gc_probability

session.gc_divisorGarbage Collection 垃圾回收:

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

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

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

如果生存時間已經超過gc_maxlifetime,就把該session刪除。

順便插個圖, 說說會話

src=http___www.myexception.cn_img_2015_05_11_01342748.png&refer=http___www.myexception.jpeg

Session 多計算容器共享的方法

1. Redis [分布式]

2. Memcache [分布式]

以Memcache 爲例:

多台機器共用一個 memcache 這樣的好處,就是在並發大訪問的情況下,還能防止單台機器因爲反複創建和打開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"; (解析數據即可[首先要先了解Session數據結構])
//表示:Session 獲取成功
//附上解析數據方法
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));
//輸出數據
//array(1) {
//    ["name"]=>
//    string(4) "Bihu"
//}

閲完此文,您的感想如何?
  • 有用

    0

  • 沒用

    0

  • 開心

    0

  • 憤怒

    0

  • 可憐

    0

1.如文章侵犯了您的版權,請發郵件通知本站,該文章將在24小時内刪除;
2.本站標注原創的文章,轉發時煩請注明來源;
3.交流群: 2702237 13835667

相關課文
  • mac開發接入微信公衆號接口返回報錯 cURL error 56: SSLRead() return error -9806

  • PHP的換行符是什麽

  • pecl安裝程序時報錯Array and string offset access syntax with curly braces is no longer supported

  • 由於商家傳入的H5交易參數有誤,該筆交易暫時無法完成,請聯繫商家解決

我要說說
網上賓友點評