我正在尝试将基于文件的正常会话转换为更易于管理的基于数据库的会话,从而在扩展和管理会话(包括远程终止会话)方面提供更大的灵活性。
这是当前的登录过程:
if($db)//$u&&$p)
{
$sql = "SELECT * FROM tbl_user WHERE ";
switch(LOGIN_METHOD)
{
case 'both':
$sql .= "(username='".$db->real_escape_string($u)."' OR useremail='".mysql_real_escape_string($u)."')";
break;
case 'email':
$sql .= "useremail='".$db->real_escape_string($u)."'";
break;
default:
$sql .= "username='".$db->real_escape_string($u)."'";
break;
}
$sql .= " AND userpassword = '".md5($sysconfig['salt'].$p)."'";
$rs = @$db->query($sql);
if(!$rs) return false;
if($rs->num_rows)
{
$this->set_session(array_merge($rs->fetch_assoc(),array('expires'=>time()+(15*60))));
$return = true;
}
$rs->free_result();
$db->close();
unset($rs,$sql);
}
我感兴趣的行,它设置会话的位置是:
$this->set_session(array_merge($rs->fetch_assoc(),array('expires'=>time()+(15*60))));
其中,set_session:
private function set_session($a=false)
{
if(!empty($a))
{
$_SESSION['exp_user'] = $a;
}
}
在表中,只存储用户名、登录电子邮件、登录密码和用户ID。
我该如何将其转换为一个基于数据库的会话系统,当然是由MySQL提供支持?
我应该使用MEMORY还是HEAP类型的表?
您应该看看set_session_save_handler
。它允许您指定会话处理程序如何检索和存储其数据。编写一个使用数据库的实现非常简单。
通过这种方法,您可以像往常一样继续使用$_SESSION
。
CCD_ 3和CCD_。您可以选择使用MEMORY
表,因为允许会话是可变的。不过,我对这方面的性能特征了解不多。我猜,如果你的会话表足够小,它无论如何都会大部分在内存中。