差不多。文件(会话)不会被立即删除,这是由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