Логика истечения срока действия , о которой я упоминал , уже делает то, что вы ожидали: сеанс нельзя использовать после истечения срока его действия.
То, что данные сеанса все еще находятся в хранилище, не имеет значения, поскольку их нельзя использовать после истечения срока действия; он будет удален при следующем запуске сборщика мусора. И это происходит с вероятностью session.gc_probability , деленной на session.gc_divisor при каждом вызове session_start
(см. Также Как долго продлится мой сеанс? ).
Редактировать Поскольку вы хотите выполнить некоторые дополнительные задачи в сеансе с истекшим сроком действия, я бы скорее рекомендовал использовать пользовательский обработчик сохранения сеанса .
При использовании класса для обработчика сохранения сеанса вы можете написать два класса: один для базового обработчика сохранения и один с расширенным сборщиком мусора, который выполняет дополнительные задачи, например ::
interface SessionSaveHandler {
public function open();
public function close();
public function read($id)
public function write($id, $data);
public function destroy($id);
public function gc($callback=null);
}
class SessionSaveHandler_WithAdditionalTasks implements SessionSaveHandler {
// …
public function gc($callback=null) {
if (!is_null($callback) && (!is_array($callback) || !is_callable($callback))) return false;
while (/* … */) {
if ($callback) $callback[0]::$callback[1]($id);
// destroy expired sessions
// …
}
}
public static function doAdditionalTasksOn($id) {
// additional tasks with $id
}
}
session_set_save_handler(array('SessionSaveHandler_DB_WithAdditionalTasks', 'open'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'close'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'read'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'write'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'destroy'),
array('SessionSaveHandler_DB_WithAdditionalTasks', 'gc')
);