关于PHP会话的几个问题

Son*_*ngo 7 php session session-timeout session-cookies

我有一些关于php会话的问题:

  1. 由于默认值session.gc_maxlifetime24分钟,那么这意味着,任何一届会议的文件不会被修改为24分钟,将被删除,会话将自动失效.

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

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

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

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

Tom*_*šek 5

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

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

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

在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) {
  }
}
Run Code Online (Sandbox Code Playgroud)

要在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'));
Run Code Online (Sandbox Code Playgroud)

请注意,实际上有更好的方法来注册处理程序本身,您甚至可以在类的构造函数中执行此操作,或者以其他许多方式执行此操作.但我认为这不是重点.

重要的是,虽然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);
}
Run Code Online (Sandbox Code Playgroud)

瞧,你自己完全绕过了PHP会话设置.