我花了一些時間尋找一個很好的答案在php.ini服務器設置如何使 會話過期。我發現了很多信息,但花了一段時間才弄清楚爲什麼 設置按照他們的方式工作。如果您和我一樣,這可能對您有所幫助:
會話在服務器上存儲爲Cookie(客戶端pc上的文件)或服務器端上的文件 。兩種方法都有優點和缺點。
對於存儲在服務器上的會話,使用三個變量。
session.gc_probability合 session.gc_divisor 的session.gc_maxlifetime
(session.gc_probability合/ session.gc_divisor)產生該 垃圾收集例程將運行的概率。當垃圾收集器運行時,它會檢查至少session.gc_maxlifetime 未被訪問的會話文件並刪除它們。
這是所有在論壇的帖子解釋得很好(這其中尤其是!) - 但 下面的問題就上來:
1)如何應用這種可能性?服務器什麼時候擲骰子?
一個:服務器期間 服務器上的任何活動會話滾動骰子每次在session_start()被調用。因此,這意味着你應該看到垃圾收集 大致運行一次,每100倍的session_start()被調用 如果你有session.gc_probability合= 1和session.gc_divisor = 100
2)會發生什麼的默認在低容量的服務器上?
答:當調用session_start()時,它首先刷新會話並使 會話值可供您使用。這會更新 服務器上會話文件的時間。它然後擲骰子,如果它贏了(100分之一的機會),它會調用垃圾收集器。垃圾收集器然後檢查所有會話標識文件,並查看是否存在有資格刪除的任何 。
所以這意味着如果你是服務器上唯一的人,你的會話 永遠不會無效,它會顯示好像改變設置沒有 的效果。比方說,你的session.gc_maxlifetime更改爲10和session.gc_probability合 爲100。這意味着有100%的機率將垃圾收集器將運行,並且 將清除出那些沒有在最後10秒被訪問的任何會話文件。
如果你在服務器上只有一個,你會不會被刪除。您需要 至少有1個其他正在運行的活動會話才能處於非活動狀態。
因此,基本上,在低容量服務器上或低容量時間 - 在垃圾回收器實際運行之前,它可能會比session.gc_maxlifetime更長, 會話實際上會被刪除。並且不知道這是如何工作的,它可能會對你完全隨機出現。
3)爲什麼他們使用的概率是多少?
答:性能。在更高容量的服務器上,您不希望垃圾收集器 在session_start()的每個請求上運行。它會不必要地減慢服務器 。因此,根據您的服務器卷,您可能需要增加 或降低垃圾收集器運行的可能性。
我希望這個事情捆綁在一起你。如果你和我一樣,並且你嘗試了 會話。gc_maxlifetime,它似乎並沒有工作(因爲你在開發服務器上嘗試了 ,以免打擾任何人),那麼這個帖子 希望能爲你節省一些頭部劃痕。
祝你好運!
當我就這個問題我自己的一些研究後偶然發現,一個可以對[這個計算器提問]這個問題非常透徹的答案( http://stackoverflow.com/a/1270960/474526),特別是爲什麼更新'session.gc_maxlifetime'和'session.cookie_lifetime'都不是可靠的方法。 – 2012-11-09 20:42:19