Настройка длительности сессий в PHP
Как узнать время жизни сессии
Перед настройкой, стоит посмотреть текущее состояние. Есть несколько методов это сделать:
1. На сервере командой php
php -i | grep session
Получаем список параметров, имеющих отношение к сессиям. Нас интересуют:
- session.cookie_lifetime => 0 => 0
- session.gc_maxlifetime => 1440 => 1440
Данные значения — значение по умолчанию. cookie_lifetime => 0 говорит о действии файлов куки до закрытия браузера, если задать этому параметру определенное значение, сессия будет прерываться при активном сеансе, поэтому лучше ее оставлять в значении ноль.
2. C помощью php-функции ini_get
<?php $maxlifetime = ini_get("session.gc_maxlifetime"); $cookielifetime = ini_get("session.cookie_lifetime"); echo $maxlifetime; echo $cookielifetime; ?>
Настройка сессий на веб-сервере
Выполняется путем настройки файла php.ini. Данный способ удобен, если мы являемся администратором веб-сервера, а также если есть гарантия, что общая настройка сессий не повлияет на работоспособность всех веб-приложений, работающих на данном сервере.
Открываем на редактирование php.ini. Его расположение зависит от сборки Linux. Точный путь можно посмотреть командой:
php -i | grep php.ini
Теперь открываем сам файл:
vi /etc/php.ini
* в моем случае команда php -i | grep php.ini вернула данный путь.
В некоторых системах, например, Ubuntu или Debian для каждой среды обработки кода создается свой php.ini файл, а также для каждой версии PHP. Например, по пути /etc/php/7.4/fpm/php.ini находится файл для php-fpm для PHP версии 7.4. Нам необходимо учитывать данный факт, чтобы настроить нужный файл.
И редактируем следующие параметры:
session.gc_maxlifetime = 86400 session.cookie_lifetime = 0
* где параметр gc_maxlifetime указывает на временя в секундах, после прошествии которого данные могут быть удалены; cookie_lifetime — время жизни файлов cookies; 86400 — 24 часа в секундах.
* если параметру gc_maxlifetime задать значение 0, действие сессий будет бесконечным. Это, как правило, не стоит делать — приведет к падению производительности и безопасности сервера.
После настройки параметров, необходимо перезагрузить сервер, являющийся интерпретатором PHP.
Если это apache:
systemctl restart apache2 || systemctl restart httpd
* в версиях Linux без systemd используем команду service apache2 restart или service httpd restart.
Если используем FastCGI (PHP-FPM).
а) для CentOS:
systemctl restart php-fpm
б) для Ubuntu или Debian:
systemctl restart php7.4-fpm
* где 7.4 — версия используемого PHP.
Настройка через файл .htaccess
Данный файл позволяет веб-мастеру управлять некоторыми настройками веб-сервера. Для его редактирования нужен доступ к файлам сайта. Способ не сработает, если в качестве обработчика PHP используется не Apache, а, например, NGINX + PHP-FPM. Хотя, тут тоже есть способ (о нем будет ниже).
В файл .htaccess вносим следующее:
php_value session.gc_maxlifetime 86400 php_value session.cookie_lifetime 0
* как можно заметить, параметры те же, что при настройки через php.ini.
Как говорилось выше, метод не сработает, если не используется Apache. Однако настройку можно выполнить на сервере (опять же, у нас должен быть соответствующий доступ).
Открываем файл настройки веб-сервера, например, в php-fpm:
vi /etc/php-fpm.d/www.conf
и редактируем/добавляем:
php_value[session.gc_maxlifetime] = 86400 php_value[session.cookie_lifetime] = 0
После перезапускаем сервис:
systemctl restart php-fpm || service php-fpm restart
Задание параметра в коде приложения
Способ может быть полезен, когда разные страницы портала должны иметь разное время жизни сессии. Для этого можно воспользоваться PHP-функциями ini_set и session_set_cookie_params, например:
<?php ini_set('session.gc_maxlifetime', 86400); ini_set('session.cookie_lifetime', 0); session_set_cookie_params(0); session_start(); ?>
Функции обязательно вызывать до открытия сесcии (session_start).
Установка сессии в приложении
Некоторые приложения могут переопределять настройки. В таком случае, задать время жизни сессии необходимо в параметрах программы. У каждого приложения свои настройки, в которых необходимо самостоятельно разобраться. Приведем для примера настройку сессии в CMS Битрикс.
Заходим в Группы пользователей - выбираем группу - Безопасность. Находим параметр «Время жизни сессии (минут)» и ставим время, например 1440 (24 часа в минутах).
Как автоматически продлевать сессии
Если сессия выдается на определенный период и заканчивается в определенное время, это может привести к прерыванию активного сеанса пользователя. Гораздо удобнее, если время действия сессии будет автоматически продлеваться, если посетитель обновляет страницу. Для этого существует параметр cookie_lifetime, который во всех примерах выше мы задавали в значении 0.
Если мы зададим значение cookie_lifetime 86400, то через 24 часа сессия прервется. Это не всегда удобно.
Если есть необходимость в контроле и прерывании сессии, можно воспользоваться php-функцией session_destroy().
Путь хранения файлов сессий
Место хранения файлов сессий задается параметром session.save_path также, так время жизни. По умолчанию, может использоваться путь /var/lib/php/sessions.
Это важный параметр — если у веб-сервера будут отсутствовать права на запись в данный каталог, это приведет к невозможности хранить сессии, что вызовет неожиданные результаты работы приложений.