預設機制,用磁碟檔案來實作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中文網其他相關文章!