2011-12-23 3 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, вы игнорируете, что в вашем методе гх и использовании, что вы считаете необходимым/право, например (с использованием кода дб псевдо):

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

+0

Спасибо за объяснение. Ты делаешь меня счастливым :) – Songo

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

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

+0

Спасибо за ваш ответ. У меня нет контроля над php.ini, так как это общий сервер, поэтому я не могу изменить session.gc_maxlifetime. Я подумываю использовать базу данных для хранения сеансов и контролировать время жизни каждого сеанса независимо (используя опцию «запомнить меня»). Это возможно? – Songo

+1

Да, это возможно. – RageZ

+0

Любые учебники или примеры действительно помогут :). Я фактически использую структуру Zend, поэтому хранение сессий в базе данных очень просто. Проблема в том, что ничего не говорится о продлении времени независимой сессии. Я думал, что функция rememberMe() выполнит трюк, но это продлит время жизни файла cookie. – Songo