2011-12-26 5 views
5

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

+0

как раз иметь отметку времени и проверить его? – footy

+1

не было бы ни одного поля db 'seat_status' с одним из трех статусов. –

+0

Возможно, вы нашли свой ответ здесь http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes –

ответ

9

Вместо того, чтобы делать поиск файлов (который включает в себя больше я/о) и т.д., Что такое куки сессии: Session 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. 

Чтобы избежать атаки, как Session fixation: (Session Закрепление является атака, которая позволяет злоумышленнику угнать действующий сеанс пользователя) держать регенерирующий идентификатор сеанса периодически говорит в течение 5 минут (я бы предложил сохранить время регенерации, а также время истечения сеанса немного больше). Более подробный список атак: attack list.

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 определяет срок службы куки в секундах, который отправляется в браузер.

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

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

Ах, нашел ссылку, которую я прочитал давно! : How do I expire a PHP session after 30 minutes?

3

Стандартные сессии 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 
Смежные вопросы