我有自己的Session类,用于处理会话操作。我想建立一个机制,即会话只在需要时启动 - 如果没有设置会话变量,系统不会创建它。
这就是代码(简化):
class Session
{
public function __construct()
{
}
protected function startSession($onlyIfExists = false)
{
if (session_id() == '')
{
if ($onlyIfExists && !isset($_COOKIE[session_name()]))
return;
@session_start();
}
}
public function setVar($id, $value)
{
$this->startSession();
$_SESSION[$id] = $value;
}
public function getVar($id)
{
$this->startSession(true); //starts session only if the session-id cookie exists (if the session was already started for this user)
if (isset($_SESSION) && array_key_exists($id, $_SESSION))
return $_SESSION[$id];
else return NULL;
}
}
然后我总是必须使用这个类对象来获取/设置会话变量,例如:
$session = new Session();
$session->getVar('test'); //does not start session at the first time
$session->setVar('test', 1); //starts session; after refreshing the page the above line does start session (cookie exists) and the value=1 is returned
这是一个很好的解决方案吗?您是否看到任何潜在的缺点,漏洞?或者也许这是每次开始会话的标准?
因为在我的应用程序中,任何会话变量只在授权后创建,所以我不需要99.999%的用户会话。
提前谢谢。
答案 0 :(得分:2)
漏洞:没有,我想。非常简单的代码,不会出错。
缺点:除了更多代码,没有,真的。
优势:仅在拥有少量授权用户的非常常用的系统中使用。实际上,与数据库查询和内容编译相比,开始会话并不是一件大事。通常,我认为没有必要对此进行优化。只需每次都开始一个会话,或者只是在相关页面上(例如,如果你有一些需要auth的后端页面,只需在那里启动会话)。当然,除了你每秒处理数千个用户。我测量了一个简单的session_start()
,大概需要0.1毫秒。
改进:正如下面的zerkms建议的那样,如果cookie存在,或者站点想要写入会话,则启动会话将是管理此会话而不是产生无用会话的最简单且最安全的方式。