将文件会话转换为基于数据库的会话

时间:2011-06-20 19:33:16

标签: php mysql session

我正在尝试将基于文件的普通会话转换为更易于管理的基于数据库的会话,从而在扩展和管理会话方面给予我更大的灵活性,包括远程终止它们。

这是当前的登录过程:

                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类型表吗?

1 个答案:

答案 0 :(得分:2)

你应该看看set_session_save_handler。它允许您指定会话处理程序如何检索和存储其数据。编写使用数据库的实现非常简单。

使用这种方法,您可以像往常一样继续使用$_SESSION

MEMORYHEAP是相同的(在MySQL中)。您可以选择使用MEMORY表,因为会话可以是易失性的。虽然我对此目的的性能特征知之甚少。我猜测如果你的会话表足够小,那么无论如何它都将主要在内存中。