php.ini 設定預設的 session.gc_maxlifetime 值為1440,該怎麼理解這個值。
當我造訪需要登入的網站的時候,一般情況下一直在操作的話登入時不會失效的,當達到一段時間沒有操作,那麼就需要重新登入了。我看了下網路上的一些資料,了解了session的保存方式和回收機制,但還是有個問題理解的不是很清楚。
先不考慮這個回收機制可能造成的問題,也不考慮cookie(假設cookie是一直有效的)。
假設session.gc_maxlifetime設定的就是這個預設值 1440,我第一次登入的時候操作了session,儲存了使用者訊息,之後就沒有改變過session。
是不是之後我不管發起了多少次請求,這個session的修改時間依舊是我登入的時間?
是不是超過1440秒之後session就失效了,不管我有沒有在這個網站操作?
還是說我一直在這個網站操作,session 的修改時間會更新,也就是說只有超過1440秒不在這個網站活動session才會刪除?
還是session不是根據修改時間來刪除的,只有在超過一定的時間不活躍之後才會刪除?
希望的到一份詳細一點的回答,謝謝!
php.ini 設定預設的 session.gc_maxlifetime 值為1440,該怎麼理解這個值。
當我造訪需要登入的網站的時候,一般情況下一直在操作的話登入時不會失效的,當達到一段時間沒有操作,那麼就需要重新登入了。我看了下網路上的一些資料,了解了session的保存方式和回收機制,但還是有個問題理解的不是很清楚。
先不考慮這個回收機制可能造成的問題,也不考慮cookie(假設cookie是一直有效的)。
假設session.gc_maxlifetime設定的就是這個預設值 1440,我第一次登入的時候操作了session,儲存了使用者訊息,之後就沒有改變過session。
是不是之後我不管發起了多少次請求,這個session的修改時間依舊是我登入的時間?
是不是超過1440秒之後session就失效了,不管我有沒有在這個網站操作?
還是說我一直在這個網站操作,session 的修改時間會更新,也就是說只有超過1440秒不在這個網站活動session才會刪除?
還是session不是根據修改時間來刪除的,只有在超過一定的時間不活躍之後才會刪除?
希望的到一份詳細一點的回答,謝謝!
SESSION的回收是在每次造訪頁面的時候進行:
回收的機率= session.gc_probability/session.gc_divisor,預設是1/1000.如果設定為1,則每次超過了SESSION的生存週期(session.gc_maxlifetime,預設是1440秒也就是24分鐘)去存取的話,SESSION一定會被回收. 客戶端每訪問一次SESSION中的變數,SESSION檔案的存取時間就會進行更新. 每次存取都是根據客戶端儲存的PHPSESSID這個cookie去請求伺服器中儲存的唯一的SESSION.當客戶端的cookie過期後,就無法知道要存取的是哪一個SESSION,儘管此時伺服器上的SESSION檔案還沒有被過期收回,這樣就會造成伺服器資源的浪費. 如果使用者透過點擊"退出"按鈕退出系統,這時程式可以註銷掉cookie和session. 如果使用者沒有通知系統就關閉瀏覽器退出,sess_PHPSESSID檔案則只能依賴手動回收.
PHP的session採用被動的回收機制,過期的session檔案不會自己消失,而是透過要求觸發"回收"來處理過期的session.
這時可以定時任務(crontab)自動刪除過期的session:
找出24分鐘前的檔案並刪除:find /path/to/sessions -cmin +24 -type f | xargs rm
這個值是距離你最後一次刷新頁面的時間,也就是你刷新完頁面後24分鐘未做任何操作,服務端就會把session刪除掉。但是,是否會刪除又和在php.ini中設定的刪除命中率有關,如session.gc_divisor=1000,session.gc_probability=1,就表示每一千個用戶調用session_start()的時候,就百分百的會執行一次垃圾回收機制,將磁碟上沒用的session檔刪除。而這個刪除又不確定是哪個使用者的session檔。所以,session是會話技術,就當成與瀏覽器是否關閉重寫打開放在一起理解就好。就是,我只要關掉瀏覽器了,這次會話就斷了,那個session自然失效。 。 。 。個人淺顯理解,如有錯誤希望有大神指正?