这听起来像你已经有了覆盖的基础知识。但是,如果您手动完成这些操作,那么您实际上只是实施自己的$_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检查以查看会话是否仍然有效,那么可以将其添加为“打开”功能的一部分。如果您想将会话数据写入十个不同的数据库(并非您会这样做),则可以在“写入”功能中完成此操作。
这些函数都是基于你如何使用$ _SESSION来使用的,通过把它们放到一个简单的类中,你可以管理它如何非常有效地工作。
您将看到会话ID是传递给读/写/销毁函数的参数,您仍然可以使用GUID生成例程以相同的方式管理该参数。但是,你可以坚持的GUID生成并检查到该会话管理器类,只是有open()函数做他们。集中,没有麻烦,没有大惊小怪。
你重新发明轮子,我的朋友 – 2009-12-11 23:41:40