Как завершить сеанс PHP после закрытия браузера ИЛИ некоторого длительного периода времени

Срок действия моего сеанса php истекает, когда пользователь закрывает браузер, но я заметил, что если я оставляю свой браузер открытым в течение длительного периода времени (например, 24+ часов), сеанс все еще сохраняется.

Есть ли способ, которым я могу истечь эти сеансы либо при закрытии браузера, либо по истечении некоторого длительного периода времени?


person Chris    schedule 23.09.2010    source источник
comment
возможный дубликат Как завершить сеанс PHP после 30 минут?   -  person Palantir    schedule 23.09.2010
comment
Когда браузер закрыт: Нет, так не работает. В противном случае см. Вопрос, связанный с Palantir.   -  person fredley    schedule 23.09.2010
comment
@fredley: Что ты имеешь в виду, что это не так? Когда я просматриваю свои файлы cookie, у меня установлен срок действия php sessions, который истекает при закрытии браузера.   -  person Chris    schedule 23.09.2010
comment
См. Также здесь stackoverflow.com/questions/777767/firefox-session-cookies   -  person Palantir    schedule 23.09.2010


Ответы (1)


Решением может быть установка данных через ini_set('session.gc_maxlifetime', <lifetime in seconds>);. Конечно, если возможно изменить конфигурацию через PHP. В противном случае вам нужно будет установить правильные значения в вашем php.ini:

ini_set(‘session.gc_maxlifetime’,30);
ini_set(‘session.gc_probability’,1);
ini_set(‘session.gc_divisor’,1);

Другой подход - установить срок действия cookie сеанса с помощью:

$expire=24*60*60;
session_set_cookie_params($expire);
session_start();
person Karol Janyst    schedule 23.09.2010
comment
Сборщик мусора - это то, что вам нужно, потому что, когда вы возитесь с временем жизни cookie, cookie не исчезает при закрытии браузера. Обязательно звоните session_regenerate_id() неавторизованным пользователям, чтобы предотвратить фиксацию сеанса. - person Wrikken; 23.09.2010
comment
@Wrikken, вы предлагаете вызывать session_regenerate_id каждый раз, когда я поймаю пользователя, который не авторизован? - person Chris; 23.09.2010
comment
использование 1 в качестве делителя и вероятности гарантирует, что мы всегда проверяем мусор, который потребует много ресурсов процессора, верно? - person Chris; 23.09.2010
comment
@chris: вы можете сделать это на основе переменной в массиве $_SESSION: session_start();if(!isset($_SESSION['id_generated_by_server'])){ session_regenerate_id(); $_SESSION['id_generated_by_server'] = true;} - person Wrikken; 23.09.2010
comment
Не стоит полагаться на то, что сборщик мусора будет делать ваши таймауты за вас. Он запускается только по СЛУЧАЙНОМ расписанию. Лучше всего поставить некоторую проверку тайм-аута в самом обработчике сеанса и принудительно выполнить повторную аутентификацию или что-то еще, если период простоя превышает тайм-аут. - person Marc B; 23.09.2010