2011-12-23 84 views
7

我对PHP的会话数的几个问题:关于PHP会议几个问题

  1. 由于为session.gc_maxlifetime的默认值是24 分钟那么这意味着任何会话文件没有被修改 24分钟将被删除,会话将自动失效。

  2. 如果我在代码中使用session_destroy(),会话将被取消设置,但会话文件本身不会被删除,直到上次修改后的24分钟内才会被删除。

  3. 延长会话使用寿命(超过24分钟)的唯一方法是将session.gc_maxlifetime扩展为更大的值。

所有这些都正确吗?或者我有什么不对吗?

此外,如果我将我的会话存储在数据库中(使用session_set_save_handler()),所有这些规则是否适用于它们?

回答

5
  1. 差不多。文件(会话)不会被立即删除,这是由session.gc_probability确定的,session.gc_divisor确定的。

  2. 否,会话将过期,但在之前的点表示确定会话文件的删除

  3. 这是正确的一般,但如果你要实现自己的会话处理程序,你可以改变会话过期的行为即使在的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会话设置。

+0

感谢您的回复。还有一个问题: 您能否在您的回复中解释更多关于第3点的内容? 目前我使用会话管理的默认配置。我无法控制php.ini,因为它是共享服务器,所以我无法修改session.gc_maxlifetime。 我正在考虑使用数据库来存储会话并独立控制每个会话的生存时间(通过使用记住我的选项)。 – Songo 2011-12-23 14:20:53

+0

感谢您的解释。你让我开心 :) – Songo 2012-01-01 10:57:59

1
  1. 正确,session.gc_maxlifetime当会话过期
  2. session_destroy不删除会话文件
  3. 是,这唯一的办法将删除会话文件。在您可以禁用使用session.gc_divider播放的垃圾回收并制作自己的垃圾回收脚本之后,基于Debian的发行版实际上会默认执行此操作。

在一些数据库中存储会话不会改变这些规则。

+0

感谢您的回复。 我无法控制php.ini,因为它是共享服务器,所以我无法修改session.gc_maxlifetime。 我正在考虑使用数据库来存储会话并独立控制每个会话的生存时间(通过使用记住我的选项)。这是可行的吗? – Songo 2011-12-23 14:24:53

+1

是的,这是可行的。 – RageZ 2011-12-23 14:26:05

+0

任何教程或例子都会帮助你:)。我实际上使用Zend框架,因此将会话存储在数据库中很容易。问题是关于延长独立会话生命时间没有任何提及。我认为rememberMe()函数可以做到这一点,但它只会延长cookie的生命周期。 – Songo 2011-12-23 14:29:16