Почти. Файл (сеанс) не будет удален немедленно, что определяется session.gc_probability и session.gc_divisor .
Нет, сеанс истекает, но удаление файла сеанса определяется, как указано в предыдущем пункте
Обычно это правильно, но если бы вы реализовали свой собственный обработчик сеанса, вы могли бы изменить поведение истечения сеанса даже таким образом, что 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, выполнив это самостоятельно.