PHP, сессии · 2 min read · Dec 27, 2025
Данные сессии PHP не удаляются при использовании пользовательского управления сессиями на debian (и ubuntu)
На системах debian (насколько я знаю, это также относится к ubuntu) сборщик мусора для сессий PHP по умолчанию отключен.
Соответствующая настройка в php.ini — session.gc_probability = 0, которая включает сборщик мусора, если установлена на значение больше нуля. Значение по умолчанию в PHP — 1, так что сборщик мусора вызывается с вероятностью 1/100 при каждом вызове скрипта PHP.
На системах debian эта настройка отключена из-за того, что путь по умолчанию для хранения сессий не доступен для записи процессом веб-сервера (и не должен быть доступен). Удаление устаревших файлов сессий выполняется системной задачей cron.
Следующий фрагмент из php.ini:
; Это отключено в пакетах Debian из-за строгих прав
; на /var/lib/php5. Вместо того, чтобы устанавливать это здесь, смотрите задачу cron в
; /etc/cron.d/php5, которая использует настройку session.gc_maxlifetime ниже.
; php-скрипты, использующие свой собственный session.save_path, должны убедиться, что сборка
; мусора включена, установив session.gc_probability
;session.gc_probability = 0Поскольку эта настройка подходит для скриптов, использующих стандартное управление сессиями PHP (файл), это может привести к проблемам, когда вы используете собственное управление сессиями, которое определяет свои собственные процедуры для чтения и записи сессий с помощью session_save_handler(). Эти классы управления сессиями в большинстве случаев также предоставят собственную функцию для сборщика мусора.
Проблема в том, что эта функция сборщика мусора никогда не будет вызвана на системе debian с вышеупомянутой настройкой php.ini. Это критично, когда данные сессии хранятся в базе данных MySQL типа MEMORY. Эта таблица ограничена по размеру значением конфигурации MySQL max_heap_table_size. Если этот размер достигнут, все дальнейшие записи сессий будут неудачными, и, вероятно, сайт перестанет работать должным образом.
Зная это, действительно важно переопределить настройку php.ini для сборки мусора в вашем собственном классе управления сессиями. Я покажу это на небольшом примере класса управления сессиями (без реальной записи/чтения):
class session {
function __destruct() {
session_write_close();
}
function __construct() {
@ini_set("session.use_trans_sid","0");
@ini_set('session.gc_probability', 1); // в debian это отключено по умолчанию...
// включить функции пользовательского обработчика сессий
session_set_save_handler(array(&$this,"_sess_open"),
array(&$this,"_sess_close"),
array(&$this,"_sess_read"),
array(&$this,"_sess_write"),
array(&$this,"_sess_destroy"),
array(&$this,"_sess_gc"));
@session_start();
}
// объявить функции обработчика сессий, определенные пользователем
function _sess_open($sSavePath, $sSessionName) {
return true;
}
function _sess_close() {
return true;
}
function _sess_read($sKey) {
// читать и возвращать значение
}
function _sess_write($sKey, $val) {
// записать новое значение
}
function _sess_destroy($sKey) {
// уничтожить сессию
}
function _sess_gc($iMaxLifeTime) {
// удалить старые сессии (из БД)
}
}
$mySession = new session();Важно, чтобы вызов @ini_set(‘session.gc_probability’, 1) находился внутри конструктора. После этого сборка мусора сессий должна работать как ожидалось, даже на системах debian с вашим собственным классом управления сессиями.
Get new posts in your inbox
No spam. Unsubscribe anytime.