當前位置:
首頁 > 知識 > PHP的session的實現機制

PHP的session的實現機制

一、默認機制,用磁碟文件來實現PHP會話。php.ini配置:session.save_handler = files

1、session_start()

A、 session_start()是session機制的開始,它有一定概率開啟垃圾回收,因為session是存放在文件中,

PHP自身的垃圾回收是無效的,SESSION的回收是要刪文件的,這個概率是根據php.ini的配置決定的,

但是有的系統是 session.gc_probability =0,這也就是說概率是0,而是通過cron腳本來實現垃圾回收。

session.gc_probability =1

session.gc_divisor =1000

session.gc_maxlifetime =1440//過期時間 默認24分鐘

//概率是 session.gc_probability/session.gc_divisor 結果 1/1000,

//不建議設置過小,因為session的垃圾回收,是需要檢查每個文件是否過期的。

session.save_path =//好像不同的系統默認不一樣,有一種設置是 「N;/path」

//這是隨機分級存儲,這個樣的話,垃圾回收將不起作用,需要自己寫腳本

B、 session會判斷當前是否有$_COOKIE[session_name()];session_name()返回保存session_id的COOKIE鍵值,

這個值可以從php.ini找到

session.name = PHPSESSID //默認值PHPSESSID

C、 如果不存在會生成一個session_id,然後把生成的session_id作為COOKIE的值傳遞到客戶端.

相當於執行了下面COOKIE 操作,注意的是,這一步執行了setcookie()操作,COOKIE是在header頭中發送的,

這之前是不能有輸出的,PHP有另外一個函數 session_regenerate_id() 如果使用這個函數,這之前也是不能有輸出的。

setcookie(session_name(),

session_id(),

session.cookie_lifetime,//默認0

session.cookie_path,//默認』/』當前程序跟目錄下都有效

session.cookie_domain,//默認為空

)

D、 如果存在那麼session_id =$_COOKIE[session_name];

然後去session.savepath指定的文件夾里去找名字為』SESS』.session_id()的文件.

讀取文件的內容反序列化,然後放到$_SESSION中

2、 為$_SESSION賦值

比如新添加一個值$_SESSION[『test』] =』blah"; 那麼這個$_SESSION只會維護在內存中,當腳本執行結束的時候,

用把$_SESSION的值寫入到session_id指定的文件夾中,然後關閉相關資源. 這個階段有可能執行更改session_id的操作,

比如銷毀一個舊的的session_id,生成一個全新的session_id.一半用在自定義 session操作,角色的轉換上,

比如Drupal.Drupal的匿名用戶有一個SESSION的,當它登錄後需要換用新的session_id

if (isset($_COOKIE[session_name()])) {

setcookie(session_name(),」,time() 42000,』/』);//舊session cookie過期

}

session_regenerate_id();//這一步會生成新的session_id

//session_id()返回的是新的值


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 千鋒JAVA開發學院 的精彩文章:

區塊鏈技術的六大核心演算法
mysql獲取隨機數據的方法

TAG:千鋒JAVA開發學院 |