Согласно народной примете, в новый дом первым нужно впускать интернет-кабель. И где он ляжет - там ставьте кровать. И стол. И комп. И жрачку.
В одном из проектов понадобилось использовать сессии, при этом чтобы время жизни этих сессий было около месяца. Первым делом я переназначил директиву 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 - сессии не удаляются по истечении этого времени. Переопределил обработчики, привязал их к БД, сборщик мусора работает чётко.
К тому же удобно отслеживать действия пользователя, писать в сессии, а при сборке мусора (перед удалением сессии) формировать отчёт о действиях пользователя.
Я за механизм сессий с переопределением обработчиков!
Отправить комментарий