2012-06-17 95 views
6

我想知道PHP如何檢測特定會話超時。PHP如何檢測會話超時?

詳細信息:我使用默認(基於文件)會話處理程序,默認會話生存期等。在php.ini中的所有內容都是默認的。

如果現在啓動了一個會話,如果有任何超時會話,PHP會執行檢查(取決於非session.gc_divisor和session.gc_probability)。但是從哪裏得到PHP會話的最後一次訪問時間來檢查?

會話文件本身僅包含工作負載,例如, x|i:1;$_SESSION['x'] = 1;,所以沒有關於上次會話訪問時間的信息。

我認爲沒有與會話開始時間相關的內存信息,因爲會話在重新啓動完整服務器後仍然有效。

那麼,PHP從哪裏獲取信息呢?它比較會話文件的mtime/ctime嗎?

回答

8

PHP的默認會話處理程序將$ _SESSION數據存儲在serialize()的文件中,該文件位於session.save_path指定的目錄中。通常文件名看起來像$filename = 'sess_' . session_id()

由於它只是一個文件,PHP可以使用該文件的mtime(上次修改時間)來確定哪些會話文件已過時。基本上它會抓住所有會話文件,其時間超過session.gc_maxlifetime值和unlink()他們。正如你所說的那樣,清理髮生的可能性是由ini變量決定的。

現在,如果您使用session_set_save_handler()創建了自己的會話處理程序,則此窗口已全部顯示出來,並且您現在可以控制會話的存儲和清理方式,但這確實解釋了默認行爲。

+0

嘿,謝謝你的回覆。你寫道「PHP可以使用該文件的mtime」。我很確定這是PHP與基於默認文件的會話處理程序一起工作的方式,但是有沒有關於此的官方聲明? – hacksteak25

+1

不,但是你可以隨時查看php源代碼,如果你確定的話。由於'上次使用時間'不會被編碼到會話數據本身中,因此會話文件的mtime是唯一可用的其他位置。 PHP不會在其他地方維護一個數據庫 - 如果有的話,會有配置選項來指定數據的保存位置/方式。 –

+0

希望能找到比尋找資源更簡單的方法;)但是你是對的。有沒有選擇的時間,所以似乎只有文件的時間。謝謝你。 – hacksteak25