2014-06-21 26 views
2

如果我做的:的ini_set「的session.gc_maxlifetime」 1天

ini_set('session.gc_maxlifetime', 86400); 

這是否意味着用戶可以離開那裏瀏覽器在同一頁(無效)爲1天就沒有會話的憂被垃圾收集並被註銷?

如果服務器配置不支持,會發生什麼情況? (它會給我一個錯誤?或者只是失敗而已?)

默認的垃圾收集時間是24分鐘,這很容易在我的系統中發生。

垃圾收集是否在session_start上運行?

回答

4

像你這樣的問題,我往往直接到PHP手冊頁面,存在於每一個INI設置以及::

session.gc_maxlifetime整數

的session.gc_maxlifetime指定的秒數之後數據將被視爲「垃圾」並可能被清理。垃圾收集可能會在會話開始時發生(取決於session.gc_probabilitysession.gc_divisor)。

  • 注: 如果不同的腳本具有不同的session.gc_maxlifetime數值但是共享了同一個地方存儲會話數據,則該腳本與最小值會清理數據。在這種情況下,請將此指令與session.save_path一起使用。

  • 注意:如果您使用默認的基於文件的會話處理程序,則文件系統必須跟蹤訪問時間(atime)。 Windows FAT不會讓你必須想出另一種方式來處理垃圾收集會話,如果你堅持使用FAT文件系統或任何其他文件系統的時間跟蹤不可用。自PHP 4.2.3以來,它使用mtime(修改日期)而不是atime。因此,您不會遇到無法使用時間跟蹤的文件系統的問題。

要映射的是在你的各種問題:

  • 這是否意味着用戶可以離開那裏瀏覽器在同一頁(無效)爲1天就無後顧之憂會話被垃圾收集,他們被註銷?

這隻意味着會話不是垃圾收集。如果由於某些其他原因(例如,cookie丟失或某個其他會話ID攜帶參數)而導致用戶丟失了會話Id,則無論會話是否被垃圾收集,用戶都將自己註銷。

  • 如果服務器配置不支持,會發生什麼? (它會給我一個錯誤嗎?或者只是失敗而已?)

這就是PHP配置而不是服務器配置。但是,如果您沒有以默認方式使用默認會話目錄來放置文件,它不會給您任何錯誤並以靜默​​方式失敗。處理會話數據垃圾收集是服務器管理的業務。

如果是標準配置但沒有足夠的文件權限,則會觸發錯誤。

在內部,也可以啓用會話調試,以便您可以獲取有關已刪除多少會話文件的消息。

見及此相關的Q &答:

  • 默認的垃圾收集時間爲24分鐘,這會在我的系統發生容易。

是,默認設置爲 「1440」,這表示1440秒,這是24分鐘。

您可以在這裏PHP源代碼中找到它:

它也用於建議INI-設置與PHP船舶的同值。

見及此相關的Q &答:

  • 是否對在session_start垃圾收集運行?

是的。您可以在session_start執行結束髮現:


這一切信息氾濫,其教訓是

所以要學到什麼? PHP爲會話數據進行垃圾回收,因爲如果啓用了會話,很多數據將很容易生成。通過會話保存目錄的標準設置,它可以用很多文件快速填滿。我已經體驗過我自己的原因,因爲我在標準垃圾回收未啓動的應用程序中遇到了一些漏洞(我更改了會話保存路徑,因爲該網站位於共享主機上,我自己的垃圾回收未正確觸發/因此最終我所能做的就是從shell訪問該目錄,並讓find完成真正花費很長時間的工作 - 但它工作正常。所以手動垃圾收集。

因此,請檢查您的垃圾回收設置,並在一兩天後驗證這些設置是否按預期工作。

除了純垃圾收集之外,在應用程序中獨立跟蹤會話的生命週期也是理智的。這通過將會話創建時間和會話上次活動時間添加到會話中起作用。如果您想允許長時間運行的會話,甚至強制用戶在一定的時間間隔後重新登錄,這將允許您重新生成會話ID。

此外,這可以保護您的會話處理,因爲那些會話尚未被垃圾收集器刪除的情況迄今爲止,因爲概率沒有被抓到,或者因爲它是唯一可用的會話。杜到垃圾收集器在會話已經啓動的設計問題,垃圾收集器可以從來沒有刪除當前會話。

我希望這回答你的問題,並給你一些指導。

+0

感謝您的洞察。我有幾個後續問題:1.如果會話被垃圾收集,但用戶擁有cookie;他們註銷了嗎? 2.如果服務器不允許session.gc_maxlifetime的ini_set,它會導致致命錯誤,還是隻是不更改值? –

+0

1.)是的,實際上是因爲該會話沒有數據 - 因此任何「登錄」或類似標誌都將消失。 2.)session.gc_maxlifetime是PHP_INI_ALL,這意味着始終可以使用ini_set。 – hakre

+0

2.這將在禁用ini_set的服務器上工作(我認爲可以這樣做)。我只是想確保它不會導致致命的錯誤。 –