关于PHP会话的几个问题

时间:2011-12-23 12:25:43

标签: php session session-cookies session-timeout

我有几个关于php会话的问题:

  1. 由于session.gc_maxlifetime的默认值 24分钟,这意味着将删除未修改 24小时的任何会话文件会话将自动失效。

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

  3. 延长会话续航时间(超过24分钟)的唯一方法是将session.gc_maxlifetime扩展为更大的值。

  4. 这些都是正确的还是我弄错了?

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

2 个答案:

答案 0 :(得分:5)

  1. 几乎。文件(会话)不会立即删除,由 session.gc_probability session.gc_divisor 决定。

  2. 不,会话将过期,但会话文件的删除按照前一点所述确定

  3. 这通常是正确的,但是如果你要实现自己的会话处理程序,你可以改变会话到期的行为,即使会忽略session.gc_maxlifetime

  4. 在db中存储会话不应该改变这些规则,但如果你愿意,可以稍微延长它们。

    修改

    这大致是你可以注册自己的会话处理程序(处理程序是一个类),然后用它做任何你想做的事情

    首先,假设我们有一个类,它将为我们的应用程序处理会话。

    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参数,您可以在gc方法中忽略它,并使用您认为必要/正确的任何内容,例如(使用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);
    }
    

    Voila,你自己完全绕过了PHP会话设置。

答案 1 :(得分:1)

  1. 正确,session.gc_maxlifetime将在会话过期时删除会话文件
  2. session_destroy不会删除会话文件
  3. 是的,这是唯一的方法。在您可以使用session.gc_divider禁用垃圾收集并创建一个脚本来进行自己的垃圾收集之后,基于Debian的发行版实际上默认情况下会这样做。
  4. 将会话存储在某个数据库中不会更改这些规则。