您好,登錄后才能下訂單哦!
這篇文章主要介紹“什么是Session機制”,在日常操作中,相信很多人在什么是Session機制問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”什么是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)。
Caution:使用以上描述的可選目錄層級參數 N 時請注意,對于絕大多數站點,
大于1或者2的值會不太合適——因為這需要創建大量的目錄:例如,值設置為 3 需要在文件系統上創建 64^3 個目錄,將浪費很多空間和 inode。
僅僅在絕對肯定站點足夠大時,才可以設置 N 大于2。
Session 生命周期
1. 第一種是通過程序
session_destory()方法清除所有session
unset(session['x'])來清除指定的session['x']。
2. 第二種是通過編輯瀏覽器
關閉后會直接清除所有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信息, 用當前時間減去session的最后修改時間(modified date),同session.gc_maxlifetime參數進行比較,
如果生存時間已經超過gc_maxlifetime,就把該session刪除。
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"
//}
到此,關于“什么是Session機制”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。