2012-11-14 44 views
2

我是一個PHP新手,正試圖圍繞會話的工作方式來解決我的問題。我有一個關於在PHP會話的行爲的一般問題。當用戶仍然在網站上時,PHP會話過期

所以我明白,每次調用session_start()時,垃圾收集器都可能以一定的概率被調用。所以我的第一個問題是,假設我的網站只有100個用戶,並且有2000個會話存儲在Web服務器上的session.save_path()文件夾中。如果作爲100個用戶之一的用戶A登錄到該網站並且調用session_start(),那麼是屬於所有用戶銷燬的用戶A之前的會話中的一個還是2000個會話之一?

我的第二個問題是,可以說用戶A在網站上約30分鐘,'session.gc_maxlifetime'設置爲1440秒,即24分鐘,24分鐘後用戶A的會話可能會被垃圾收集器刪除,即使用戶仍然在網站上活動?

如果是的話,是一個新的會話,其中以前刪除的會話的所有相同信息每24分鐘開始一次,因爲這將防止用戶數據丟失。

我很抱歉,如果這些問題聽起來很簡單,但我很困惑會議的概念,並希望澄清這個概念。

任何幫助將不勝感激。

回答

2

PHP的會話垃圾收集器運行的概率由session.gc_probability除以session.gc_divisor定義。默認情況下,這是1/100,這意味着以100爲概率檢查上述超時值。

這意味着無論何時啓動新會話,都有可能觸發垃圾回收器。比所有會話更老,然後maxlifetime將被刪除

如果有人在網站上活躍,此會話將永遠不會被刪除。在每個頁面刷新時,實際會話將重置此會話的生命週期。只有未使用的會話將被刪除。因此,如果用戶只是在頁面上閒置而什麼也不做,這個會話可能會被刪除。他必須開始新的會議。

我希望這有助於你理解會話

+0

關於原始海報關於「用戶A」與所有用戶的會話的問題 - 運行垃圾收集時,會影響所有會話。 PHP無法區分用戶與新任意用戶的新會話。 –

+0

感謝您的回覆。 – anonuser0428

+0

我對本傑明的問題有一個後續問題。我想知道會話生存期是否在每次頁面刷新時重置,或者在每次刷新頁面後是否開始全新會話?因爲刷新頁面時,代碼將重新運行,並且會運行session_start()。 – anonuser0428

0

垃圾收集適用於所有會話,因爲PHP沒有會話「所有權」的知識;所有在time() - ini_get('session.gc_maxlifetime')之前修改的會話對象都將被刪除。

每當使用session_start()訪問特定會話對象時,在請求結束時(隱式)或調用session_write_close()(顯式)時,它的修改時間(應該)被更新。這意味着只要用戶偶爾加載頁面,會話就不會被破壞。

順便說一句,我講會話對象,而不是文件,因爲會話的物理存儲可以使用session_set_save_handler()改變。

相關問題