Тайм-ауты сеанса в PHP: лучшие практики

Какова фактическая разница между session.gc_maxlifetime и session_cache_expire() ?

Предположим, я хочу, чтобы сеанс пользователя был недействительным после 15 минут неактивности (а не 15 после его первого открытия). Какой из них мне поможет?

Я также знаю, что могу сделать session_set_cookie_params() который может установить время cookie пользователя в течение некоторого времени. Однако истечение срока действия файла cookie и фактического сеанса, истекающего на стороне сервера, не совпадают; это также удаляет сеанс, когда файл cookie истек?

Другое решение, которое у меня есть, – это просто $_SESSION['last_time'] = time() для каждого запроса и сравнение сеанса с текущим временем, удалив сеанс на основе этого. Я надеялся, что есть более «встроенный» механизм для обработки этого.

Благодарю.

Каждый раз, когда session_start вызывается, временная метка файла сеанса (если она существует) обновляется, которая используется для расчета, если значение session.gc_maxlifetime превышено.

Что еще более важно, вы не можете зависеть от истечения срока действия сеанса после превышения времени session.gc_maxlifetime.

PHP запускает сборку мусора на истекших сеансах после загрузки текущего сеанса и с использованием session.gc_probability и session.gc_divisor вычисляет вероятность того, что сбор мусора будет запущен. По умолчанию его вероятность равна 1%.

Если у вас мало посетителей, существует вероятность того, что неактивный пользователь сможет получить доступ к сеансу, срок действия которого истек и был удален. Если это важно для вас, вам нужно будет сохранить временную метку в сеансе и рассчитать, как журнал был неактивным.

Этот пример заменяет session_start и устанавливает тайм-аут:

 function my_session_start($timeout = 1440) { ini_set('session.gc_maxlifetime', $timeout); session_start(); if (isset($_SESSION['timeout_idle']) && $_SESSION['timeout_idle'] < time()) { session_destroy(); session_start(); session_regenerate_id(); $_SESSION = array(); } $_SESSION['timeout_idle'] = time() + $timeout; } 

Я потратил некоторое время на поиск хорошего ответа на то, как настройки сервера php.ini заставляют сеансы истекать. Я нашел много информации, но потребовалось некоторое время, чтобы выяснить, почему настройки работают так, как они делают. Если вы похожи на меня, это может быть полезно для вас:

Сеансы хранятся в виде файлов cookie (файлы на клиентском компьютере) или на стороне сервера в виде файлов на сервере. Оба метода имеют преимущества и недостатки.

Для сеансов, хранящихся на сервере, используются три переменные.

session.gc_probability session.gc_divisor session.gc_maxlifetime

(session.gc_probability / session.gc_divisor) дает вероятность запуска программы сбора мусора. Когда сборщик мусора запускается, он проверяет файлы сеанса, к которым не было доступа, по крайней мере, session.gc_maxlifetime и удаляет их.

Все это очень хорошо объясняется в сообщениях на форуме (это особенно!) – Но возникают следующие вопросы:

1.) Как применяется эта вероятность? Когда сервер бросает кости?

A: Сервер катит кости каждый раз, когда session_start () вызывается во время любого активного сеанса на сервере. Таким образом, это означает, что вы должны увидеть, как сборщик мусора запускается примерно один раз на каждые 100 раз, когда вызывается session_start (), если у вас есть значение по умолчанию session.gc_probability = 1 и session.gc_divisor = 100

2.) Что происходит на серверах с низким объемом?

A: Когда session_start () называется FIRST, он обновляет сеанс и делает доступными для вас значения сеанса. Это обновляет время вашего файла сеанса на сервере. Он THEN закатывает кости, и если он победит (1 из 100 шансов), он вызывает сборщик мусора. Затем сборщик мусора проверяет все файлы идентификаторов сеансов и видит, есть ли подходящие для удаления файлы.

Таким образом, это означает, что если вы единственный человек на сервере, ваш сеанс никогда не станет неактивным, и он будет выглядеть так, как если бы изменение настроек не повлияло. Предположим, вы изменили session.gc_maxlifetime на 10 и session.gc_probability на 100. Это означает, что 100% вероятность, что сборщик мусора будет запущен, и он очистит любые файлы сеанса, которые не были доступны за последние 10 секунд.

Если вы единственный на сервере, ваш сеанс не будет удален. Вам нужно, по крайней мере, еще один активный сеанс, чтобы ваш неактивен.

Таким образом, в основном, на сервере с низким уровнем громкости или при малом объеме времени – он может быть намного длиннее, чем session.gc_maxlifetime, прежде чем сборщик мусора фактически запустится и сеансы фактически будут удалены. И не зная, как это работает, это может показаться вам совершенно случайным.

3.) Почему они используют вероятность?

Выступление. На сервере с более высоким объемом вы не хотите, чтобы сборщик мусора работал по каждому запросу session_start (). Это будет бесполезно замедлять работу сервера. Поэтому, в зависимости от объема вашего сервера, вы можете увеличить или уменьшить вероятность запуска сборщика мусора.

Надеюсь, что это свяжет вещи для вас. Если вы похожи на меня, и вы попробовали session.gc_maxlifetime, и он, похоже, не работал (потому что вы пробовали его на сервере разработки, чтобы никого не беспокоить), то это сообщение, надеюсь, спасло вас от царапин на голове.

Удачи!

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

session_cache_expire () управляет только заголовком HTTP «Expires». Этот заголовок определяет, как долго содержимое загруженной страницы остается в кеше браузера пользователя.

Чтобы проверить текущие значения, этот код будет полезен:

 $gc_maxlifetime = ini_get('session.gc_maxlifetime'); $gc_probability = ini_get('session.gc_probability'); $gc_divisor = ini_get('session.gc_divisor');