Несколько вопросов о сессиях PHP - PullRequest
7 голосов
/ 23 декабря 2011

У меня есть несколько вопросов о php-сессиях:

  1. Поскольку значение по умолчанию для session.gc_maxlifetime равно 24 минуты , это означает, что любой файл сеанса, который не был изменен в течение 24 минут, будет удален, а сеанс истекает автоматически.

  2. Если я использую session_destroy() в своем коде, сеанс будет не установлен, но сам файл сеанса не будет удален, пока не пройдет 24 минуты с момента его последнего изменения.

  3. Единственный способ продлить время жизни сеанса (более 24 минут) - это увеличить session.gc_maxlifetime до большего значения.

Все ли это правильно или я что-то не так понял?

Кроме того, если я буду хранить свои сеансы в базе данных (используя session_set_save_handler()), будут ли применяться к ним все эти правила?

Ответы [ 2 ]

5 голосов
/ 23 декабря 2011
  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, вы игнорируете это в своем методе 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);
}

Вуаля, вы просто полностью обошли настройки сеанса PHP, выполнив это самостоятельно.

1 голос
/ 23 декабря 2011
  1. Правильно, session.gc_maxlifetime удалит файл сеанса по истечении сеанса
  2. session_destroy не удаляет файл сеанса
  3. Да, это единственный способ. После того, как вы можете отключить сборку мусора с помощью session.gc_divider и создать скрипт для создания собственной сборки мусора, дистрибутив на основе Debian фактически делает это по умолчанию.

Хранение сеанса в некоторой базе данных не изменит эти правила.

...