2011-12-26 94 views
5

我正在建立在線訂票網站。在這我做了以下事情:用戶搜索巴士座位號碼。該數據庫的座位號碼更新爲temp_seat_book = 'Y'。如果他預訂門票付款,他的狀態將更新爲final_ticket_book = 'Y'。現在我想要刪除temp_seat_book = 'Y'但是 final_ticket_book = 'N'的字段。爲此,我需要刪除10分鐘以上的session_ids和final_ticket_book = 'N'。那麼我如何才能實現後臺工作?一段時間後取消會話

+0

只是有一個時間戳,並檢查它? – footy 2011-12-26 06:17:12

+1

將不會包含'seat_status'的單個數據庫字段包含3個狀態之一更容易。 – 2011-12-26 06:19:23

+0

可能你在這裏找到你的答案 http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes – 2011-12-26 06:23:46

回答

9

而不是做對文件的搜索(這涉及到更多的I/O)等, 什麼是會話cookie: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攻擊:(會話固定是允許攻擊者劫持一個有效的用戶會話的攻擊)保持再生會話ID定期說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被設置爲最大到期要使用時間。 你可以在你的php.ini直接做到這一點

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


或者 設置。

並且還

session.cookie_lifetime

session.cookie_lifetime指定cookie的以秒計的壽命被髮送給瀏覽器。

但是,銷燬會話必須在服務器端而不是客戶端處理。 將session.cookie_lifetime設置爲0會使會話的cookie以會話cookie的方式工作,即會話cookie僅在瀏覽器關閉之前有效。

雖然這個方法有點乏味,但它更優雅。

啊,找到我很久以前看過的鏈接了! :How do I expire a PHP session after 30 minutes?

3

標準PHP會話存儲在文件中。你可以實現一個簡單的shell腳本發現已沒有在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 
相關問題