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