В одном из проектов понадобилось использовать сессии, при этом чтобы время жизни этих сессий было около месяца. Вот только не всё так сразу заработало, как хотелось бы. После переназначения session.gc_maxlifetime и session.cookie_lifetime сессии пропадали по прошествии стандартных 30 минут…
Под катом решение проблемы…
В одном из проектов понадобилось использовать сессии, при этом чтобы время жизни этих сессий было около месяца. Первым делом я переназначил директиву session.gc_maxlifetime и заодно session.cookie_lifetime с помощью функции ini_set. Причем это необходимо сделать до вызова session_start(), иначе работать не будет из-за уже отправленных заголовков браузеру. Вот что у меня получилось в итоге:
ini_set(‘session.cookie_lifetime’, 2592000);
session_start();
— 2592000 – количество секунд в месяце (30 дней).
— session.gc_maxlifetime — количество секунд, после чего данные будут считаться ‘мусором’ и зачищаться.
— session.cookie_lifetime — период хранения куки в секундах. Если 0 – значит кука будет хранится, пока браузер не будет закрыт.
Этот код НЕ РАБОТАЛ – все сессии терялись после стандартных 30 минут. Как оказалось, для того, чтобы мы могли установить специфические параметры времени жизни сессии для определённого скрипта, нам необходимо было изменить директиву session.save_path.
В чем же тут проблема? Да в том, что все сессии хранятся по умолчанию в одной папке — /tmp. При запуске другого скрипта на сервере, со стандартным временем жизни сессии, запускается также сборщик мусора, который все «старые», по его меркам, сессии из папки удаляет.
Поэтому я указал другую папку. Вот как мой код выглядел в итоге:
ini_set(‘session.cookie_lifetime’, 2592000);
ini_set(‘session.save_path’, LIB_PATH.’\sessions’);
session_start();
Папку с сессиями желательно размещать вне зоны сайта или в папке с сессиями создать файлик .htaccess с фразой в нутрии — Deny from all.