首先說一下session的創建的開始到結束的過程。
當程序需要為某個客戶端的請求創建一個 session 的時候,服務器首先會檢查這個客戶端是否已經包含了一個 session 標識,這個我們稱為 session id(獲取方法為 session_id() ),如果已包含一個 session id 則說明此客戶端之前已經創建過 session,服務器則按照 session id 把這個 session 中的值檢索出來,如果客戶端不包含 session id,說明此客戶端第一次請求服務器或手動清除過緩存文件,則為此客戶端創建一個 session 并且生成一個與此 session 相關聯的 session id,一般來說,session id 的值是不會重復的,并且加密的字符串,這個 session id 將被在本次響應中返回給客戶端保存。
session 在何時被創建 ?
通常(是指通常)是在瀏覽器向服務器端第一次請求時被創建,并且它會占用一定的內存空間,因此在不必要的情況下,盡最關閉 session 。
session 何時被刪除 ?
通常情況下,session 在會在這幾種情況下被刪除:
一是使用 session_destroy() 重置函數手動刪除;
二是 session 的上次活動時間距離當前時間的間隔超過了 session 的超時設置的時間;三是服務器進程被停止。
怎么在瀏覽器關閉時刪除 session ?
理論上來說,是做不到這一點,http是一種無狀態協議,因此服務器不知道客戶端什么時候關掉的瀏覽器,并且PHP也沒有一個關相的函數來獲取此項信息,但這個問題還可以得到解決,就是使用 網頁特效 代碼 window.oncolose 來監視瀏覽器的關閉動作,然后用Ajax向服務器端發送一個請求來刪除 session ,但這個辦法也并不會完全解決問題,原因是在有些情況下比如瀏覽器崩潰、突然斷電、用戶死機等這些時候并不能作出反應。
如何設置使session在一段時間過后自動失效(刪除)?
session_start()是session機制的開始,它有一定概率開啟垃圾回收,因為session是存放在文件中,PHP自身的垃圾回收是無效的,SESSION的回收(刪除)是要刪文件的,這個概率是根據php.ini的配置決定的,但是有的系統是 session.gc_probability = 0,這也就是說概率是0,而是通過cron腳本來實現垃圾回收(即刪除session)。
PHP中的session有效期默認是1440秒(24分鐘,注:php5里默認的是180分】,也就是說,客戶端超過24分鐘沒有刷新,當前session就會失效。很明顯,這是不能滿足需要的。
一個已知管用的方法是,使用session_set_save_handler,接管所有的session管理工作,一般是把session信息存儲到數據庫,這樣可以通過SQL語句來刪除所有過期的session,精確地控制session的有效期。這也是基于PHP的大型網站常用的方法。但是,一般的小型網站,似乎沒有必要這么勞師動眾。
但是一般的Session的生命期有限,如果用戶關閉了瀏覽器,就不能保存Session的變量了!那么怎么樣可以實現Session的永久生命期呢?
新聞熱點
疑難解答