PHP Продление времени жизни сессии. Почему сессии теряются?

В одном из проектов понадобилось использовать сессии, при этом чтобы время жизни этих сессий было около месяца. Первым делом я переназначил директиву session.gc_maxlifetime и заодно session.cookie_lifetime с помощью функции ini_set. Причем это необходимо сделать до вызова session_start(), иначе работать не будет из-за уже отправленных заголовков браузеру. Вот что у меня получилось в итоге:

ini_set('session.gc_maxlifetime', 2592000);
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.gc_maxlifetime', 2592000);
ini_set('session.cookie_lifetime', 2592000);
ini_set('session.save_path', LIB_PATH.'\sessions');
session_start();

Папку с сессиями желательно размещать вне зоны сайта или в папке с сессиями создать файлик .htaccess с фразой в нутрии - Deny from all.

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Вопрос

Интересно это будет влиять как то на быстродействие и везде пишут нежелательно так делать. В день может быть кучу посетителей и если это умножить на месяц выйдет достаточно много... И почему нельзя было воспользоваться куками или же в базу/файл накрайняк записать ?

Ответ)

Хм...Можно ссылочку, где пишут что так нельзя делать? Очень интересно почитать... Лично я не вижу ничего тут плохого.
По поводу быстродействия, и хранения в базе:
То, что сессия представляет из себя файл с уникальным именем понятно. При этом по сравнению с базой - обращение на чтение и запись в файл намного быстрее, в конечном ведь итоге база тоже хранится в файле и необходимые данные придётся читать после еще кучи действий по обращению к MySQL. А вот преимущество базы - кеш, тут не особо применимо - для каждого пользователя свой набор данных... По моему с помощью базы будет медленее... Да и отчитску базы нужно брать на себя...

По поводу удобства, и хранения данных в файле:
Функции по созданию, записи в файл сессии, отправка заголовков, привязка пользователя через идентификатор к файлу - это всё уже реализовано на уровне сервера, браузера, языка программирования. Так зачем изобретать велосипед...Тем более функции по работе с сессиями на PHP писали, пожалуй, люди намного умнее меня.

По кукам - конечно же можно хранить и там, и это было бы оптимальнее по ресурсам, но в моём случае это не безопастно. Их (данные в куках) легко можно менять - что меня не устраивает.

В моём случае пользователи анонимные, набор данных для каждого одинаковый, а хранить нужно всего пару циферок и флагов. Пытаться привязать каждого пользователя к его данным - это означает сразуже необходимость создания каких либо идентификаторов, хранение их в куках, а это уже сделано в сессиях за нас))))

Как-то криво работает

Как-то криво работает стандартный сборщик мусора в механизме сессий php. Я поставил 100 вероятность запуска сборщика и для эксперимента короткое время gc_maxlifetime - сессии не удаляются по истечении этого времени. Переопределил обработчики, привязал их к БД, сборщик мусора работает чётко.
К тому же удобно отслеживать действия пользователя, писать в сессии, а при сборке мусора (перед удалением сессии) формировать отчёт о действиях пользователя.
Я за механизм сессий с переопределением обработчиков!

Отправить комментарий

  • Доступны HTML теги: <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Строки и параграфы переносятся автоматически.

Подробнее о форматировании

Image CAPTCHA
Enter the characters shown in the image.
Поделиться: