Практически. Файл (сеанс) не будет удален немедленно, что определяется 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, вы игнорируете, что в вашем методе гх и использовании, что вы считаете необходимым/право, например (с использованием кода дб псевдо):
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, сделав это самостоятельно.
Спасибо за ответ. Еще один вопрос: Не могли бы вы подробнее рассказать о пункте 3 в своем ответе? В настоящее время я использую конфигурации по умолчанию для управления сеансом. У меня нет контроля над php.ini, поскольку это общий сервер, поэтому я не могу изменить session.gc_maxlifetime. Я подумываю использовать базу данных для хранения сеансов и контролировать время жизни каждого сеанса независимо (используя опцию «запомнить меня»). – Songo
Спасибо за объяснение. Ты делаешь меня счастливым :) – Songo