我(到目前为止)已经使用客户端cookie和数据库条目处理用户会话.
当用户登录时,我生成一个guid并将其放在客户端计算机上的cookie中.然后我在'sessions'表中创建一个条目,并在那里添加guid,ip地址,用户名,权限等.然后当用户访问页面时,我检查是否有会话cookie.如果是这样,我检查数据库中的guid在cookie中,并确保IP地址匹配.如果是,则用户使用db表中的其余信息登录.如果出现问题(错误的IP地址,过期的会话等),我删除数据库条目并删除guid cookie.
我之前从未使用过$ _SESSION全局.
我的方式是好的做法还是我需要重新思考我是如何处理这个?
听起来你已经掌握了基础知识.但是,如果你手动完成所有操作,那么你实际上只是实现自己的$_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();
Run Code Online (Sandbox Code Playgroud)
您可以使用此功能获得您刚才描述的所有功能,但仍然具有$ _SESSION的功能为您完成.
例如,如果您想在启动之前添加IP检查以查看会话是否仍然有效,则可以将其添加为"打开"功能的一部分.如果您想将会话数据写入十个不同的数据库(不是您想要的),您可以在"写入"功能中完成此操作.
这些函数都是根据你如何使用$ _SESSION来使用的,通过将它们放入一个简单的类中,你可以非常有效地管理它的工作方式.
您将看到会话ID是传递给读/写/销毁函数的参数,您仍然可以使用GUID生成例程以相同的方式管理它.但是,你可以坚持guid生成并检查这个会话管理器类,只需让open()函数执行它们.集中,没有麻烦,没有大惊小怪.