Отмена сеанса через некоторое время - PullRequest
5 голосов
/ 26 декабря 2011

Я строю сайт онлайн бронирования билетов.В этом я делаю следующие вещи: Пользователь ищет автобус с их номерами мест.База данных обновляется с номерами мест с temp_seat_book = 'Y'.Если он закажет билет, заплатив деньги, его статус будет обновлен до final_ticket_book = 'Y'.Теперь я хочу удалить поле, у которого temp_seat_book = 'Y', но final_ticket_book = 'N'.Для этого мне нужно удалить session_ids, который старше 10 минут и final_ticket_book = 'N'.Так как же мне реализовать фоновое задание?

Ответы [ 2 ]

9 голосов
/ 26 декабря 2011

Вместо поиска файлов (что включает в себя больше ввода / вывода) и т. Д., Что такое файл cookie сеанса: файл cookie сеанса
Лучший способ - сохранить отметку времени «самого последнего действия» в переменной $ _SESSION.
Обновление данных сеанса по каждому запросу (включая автоматические периодические вызовы ajax, если таковые имеются).

Допустим, вы хотите сбросить сеанс через 10 минут,

if (isset($_SESSION['most_recent_activity']) && 
    (time() -   $_SESSION['most_recent_activity'] > 600)) {

 //600 seconds = 10 minutes
 session_destroy();   
 session_unset();  

 }
 $_SESSION['most_recent_activity'] = time(); // the start of the session.

Чтобы избежать таких атак, как Фиксация сеанса : (Фиксация сеанса - это атака, которая позволяет злоумышленнику перехватить действительный сеанс пользователя), периодически обновляйте идентификатор сеанса, скажем, в течение 5 минут (я бы предложил время регенерации, а также время окончания сессии немного больше). Более подробный список атак: список атак .

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
    } 
else if (time() - $_SESSION['CREATED'] > 600) {
    session_regenerate_id(true);    
    $_SESSION['CREATED'] = time();  
    }

Также убедитесь, что для session.gc-maxlifetime установлено максимальное время истечения, которое вы хотите использовать. Вы можете сделать это

ini_set('session.gc-maxlifetime', 600)


Или Установите его прямо в php.ini.

а также

session.cookie_lifetime :

session.cookie_lifetime указывает время существования файла cookie в секундах, который отправляется в браузер.

Но об уничтожении сеанса нужно заботиться на стороне сервера, а не на стороне клиента. Установка для session.cookie_lifetime значения 0 приведет к тому, что cookie-файл сеанса будет вести себя так, как cookie-файл сеанса, т. Е. Что cookie-файл сеанса действителен только до закрытия браузера.

Хотя этот метод немного утомителен, он более элегантен.

Ах, нашел ссылку, которую я прочитал давным-давно! : Как мне закончить сеанс PHP через 30 минут?

3 голосов
/ 26 декабря 2011

Стандартные сессии PHP хранятся в файлах. Вы можете реализовать простой сценарий оболочки, чтобы найти любой файл сеанса, который не был затронут в течение 10 минут:

find /path/to/session/dir/* -mmin -10

grep может использоваться для поиска файлов сеансов, в которых хранится значение final_ticket_book = 'N':

grep -l 's:17:"final_ticket_book";s:1:"N";'

(у флагов -l команда grep выплевывает имена соответствующих файлов).

Объединение двух дает вам:

find /path/to/session/dir -mmin -10|xargs grep -l 's:17:"final_ticket_book";s:1:"N";'|xargs rm -f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...