首頁  >  文章  >  後端開發  >  PHP的SESSION機制解析

PHP的SESSION機制解析

小云云
小云云原創
2017-11-08 15:10:121672瀏覽

預設機制,用磁碟檔案來實作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.save_path指定的資料夾裡去找名字為'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()返回的是新的值


以上是PHP的SESSION機制解析的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn