在PHP中session默認是以文件的形式存儲於服務器的
而客戶端和服務端則是通過session_id來完成握手的,默認情況下PHP會將session_id存儲於cookie中,用戶每次請求時該session_id都會通過cookie傳到服務器,下面是php.ini中的相關配置信息:
session.save_path="C:\xampp\tmp" 文件的存儲路勁
session.use_cookies=1 是否使用cookie存取session_id
session.name=PHPSESSID 存儲session_id的鍵名
session.use_only_cookies=0 是否只使用cookie來處理session_id
如何改變session的默認存儲方式:
在php中我們可以通過使用session_set_save_handler函數才改變這種默認方式,該方法有兩種形式的重載
php < 5.4 : 接受接受6個回調函數來執行session的管理SessionHandlerInterface
打開(open):接受兩個參數:1,文件路勁;2,session_id
關閉(close)
讀取(read):讀取session信息,接受一個session_id作為參數
寫入(write):將信息寫入session,接受一個session_id作為參數
銷毀(destroy):銷毀一個session,接受一個session_id作為參數
回收(gc):當出發session回收時調用,接受一個session的過期時間(lifetime)作為參數
php>=5.4 session_set_save_handler可以接受一個SessionHandlerInterface的實例來設置session的存儲方式
我們可以通過實現SessionHandlerInterface接口,或者重寫SessionHandler類方法的實現,來編寫自定義的session
下面說說session的回收機制
在php中session的回收時由session的回收頻率和過期時間決定的,在php.ini中表現為
session.gc_probability=1
session.gc_divisor=100
session.gc_maxlifetime=1440
gc_maxlifetime很好理解,表示session的過期時間1440秒
gc_probability/gc_divisor 為session回收的頻率,這個怎么理解呢,每次在我們調用session_start()的時候我們都有可能調用gc方法對過期的session進行回收,如上面設置所示,這里回收的概率為1/100,如果用戶的每次請求我們都去回收過期session可能會對服務器造成壓力,特別是請求特別多的時候,所以往往session的回收頻率應該根據站點的訪問量來調節
session_start細節
session_start首先會生成一個session_id,默認情況下會將這個ID寫入一個會話cookie,之后會調用open,read方法,生成全局變量$_SESSION,之后做gc處理,所以如果我們的web應用只有一個會話,那么這個會話的信息是永遠不會丟失的即使我們的會話已經過期。