差不多。文件(會話)不會被立即刪除,這是由session.gc_probability確定的,和session.gc_divisor確定的。
否,會話將過期,但在之前的點表示確定會話文件的刪除
這是正確的一般,但如果你要實現自己的會話處理程序,你可以改變會話過期的行爲即使在的session.gc_maxlifetime被忽略
存儲在數據庫會話應該不會改變這些規則這樣一種方式,但可以舒展他們一點點,如果你想。
編輯:
這大致如何可以註冊自己的會話處理器(處理器爲一類),然後做任何你想做的事情
首先,假設我們有一個類,即將會爲我們的應用程序處理會話。
class MySession {
function open($save_path, $session_name) {
}
function close() {
}
function read($id) {
}
function write($id, $sess_data) {
}
function destroy($id) {
}
function gc($maxlifetime) {
}
}
要註冊在PHP中的處理程序,您只需要在我們的例子中調用session_set_save_handler
功能,如:
// register the session handler
$sess = new MySession();
session_set_save_handler(array($sess, 'open'),
array($sess, 'close'),
array($sess, 'read'),
array($sess, 'write'),
array($sess, 'destroy'),
array($sess, 'gc'));
注意,其實有更好的方法來註冊處理程序本身,你可以甚至可以在你的課堂的構造函數中或者其他許多方面做到這一點。但我認爲這不是重點。
重要的是,儘管PHP爲您提供了與會話管理機制的標準行爲相對應的所需變量,但您並不需要尊重它(並非我會推薦這樣做)。
要回答下面留言,忽略maxlifetime參數,你忽略了,在您的氣相色譜法和使用任何你認爲必要/右,例如(使用DB僞代碼):
function gc($maxlifetime) {
$sql = "DELETE * FROM MySession WHERE lastAccess < NOW()-3600";
// execute the query, say I have PDO instance in $dbh variable
$dbh->execute($sql);
}
瞧,你只需完全繞過PHP會話設置。
感謝您的回覆。還有一個問題: 您能否在您的回覆中解釋更多關於第3點的內容? 目前我使用會話管理的默認配置。我無法控制php.ini,因爲它是共享服務器,所以我無法修改session.gc_maxlifetime。 我正在考慮使用數據庫來存儲會話並獨立控制每個會話的生存時間(通過使用記住我的選項)。 – Songo 2011-12-23 14:20:53
感謝您的解釋。你讓我開心 :) – Songo 2012-01-01 10:57:59