我有自己的会话类,它处理会话操作。我想建立一种机制,即会话仅在需要时启动 - 如果未设置会话变量,系统不会创建它。
这就是代码(简化):
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% 的用户的会话。
提前谢谢你。
漏洞:我猜没有。非常简单的代码,没有太多错误。
缺点:除了更多的代码,没有,真的。
优势:仅在具有少数授权用户的使用率非常高的系统中。实际上,与数据库查询和内容编译之类的事情相比,启动会话并不是什么大问题。通常,我认为没有必要对此进行优化。只需每次启动一个会话,或者仅在相关页面上启动(例如,如果您有几个后端页面确实需要身份验证,只需在那里启动会话)。当然,除了您每秒处理数千个用户。我测量了一个简单的session_start()
大约需要0.1ms。
改进:正如 zerkms 在下面建议的那样,如果 cookie 存在或站点想要写入会话,则启动会话将是管理此问题的最简单且防弹的方法,并且不会生成无用的会话。