一段时间后取消设置会话

时间:2011-12-26 06:13:01

标签: php session background

我正在建立一个在线机票预订网站。在这里我做了以下事情:用户用他们的座位号搜索公交车。使用temp_seat_book = 'Y'的座位号更新数据库。如果他预订机票付款,他的状态将更新为final_ticket_book = 'Y'。现在我要删除temp_seat_book = 'Y'但是的字段 final_ticket_book = 'N'。为此,我需要删除超过10分钟且final_ticket_book = 'N'的session_ids。那么我如何实现后台工作?

2 个答案:

答案 0 :(得分: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设置为您要使用的最长到期时间。 你可以这样做

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


或者 直接在php.ini中设置。

以及

session.cookie_lifetime

  

session.cookie_lifetime指定发送到浏览器的cookie的生命周期(以秒为单位)。

  但是,必须在服务器端而不是客户端处理销毁会话。   将session.cookie_lifetime设置为0将使会话的cookie的行为与会话cookie的行为方式相同,即会话cookie仅在浏览器关闭之前有效。

虽然这种方法有点乏味,但它更优雅。

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

答案 1 :(得分: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 flags有grep吐出匹配的文件的名称。)

将两者结合起来可以得到:

find /path/to/session/dir -mmin -10|xargs grep -l 's:17:"final_ticket_book";s:1:"N";'|xargs rm -f