听起来您已经掌握了基础知识。但是,如果您手动完成所有这些操作,那么您实际上只是在实现自己的 $_SESSION,而没有利用它已经可以为您完成所有这些工作的事实。
如果你想使用数据库来处理会话,你可以用你自己的覆盖默认的会话处理。看看session_set_save_handler()。我在我的应用程序中执行此操作。
class SessionHandler
{
public function open($save_path, $session_name)
{
$this->sessionName = $session_name;
return(true);
}
public function close() {
//stuff
}
public function read($id) {
$expiretime = date("Y-m-d H:i:s",time() - $this->maxLifeTime);
$sql = "SELECT * FROM sessions where sessionid='".$this->db->escapeData($id)."' AND lastupdated>='".$expiretime."' LIMIT 1";
$result = $this->db->query($sql);
//etc.
}
//etc.
public function setAsSessionHandler()
{
session_set_save_handler(
array($this,'open'),
array($this,'close'),
array($this,'read'),
array($this,'write'),
array($this,'destroy'),
array($this,'gc')
);
}
}
$sessionHandler = new SessionHandler();
$sessionHandler->setAsSessionHandler();
您可以拥有刚才描述的所有功能,但您仍然可以使用 $_SESSION 为您实现这些功能。
例如,如果您想在启动会话之前添加 IP 检查以查看会话是否仍然有效,您可以将其添加为“打开”功能的一部分。如果您想将会话数据写入 10 个不同的数据库(不是您想要的),您可以在“写入”函数中完成此操作。
这些函数都是根据你如何使用 $_SESSION 来使用的,通过将它们放入一个简单的类中,你可以非常有效地管理它的工作方式。
您会看到会话 id 是传递给读/写/销毁函数的参数,并且您仍将使用 GUID 生成例程以相同的方式进行管理。但是,您可以将 guid 生成并检查到此会话管理器类中,并简单地让 open() 函数执行它们。集中,没有混乱,没有大惊小怪。