4

我有自己的 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% 的用户不需要会话。

先感谢您。

4

1 回答 1

3

漏洞:没有,我猜。非常简单的代码,不会出错。

缺点:除了更多的代码,真的没有。

优点:仅在具有少数授权用户的高度使用的系统中。确实,与数据库查询和内容编译之类的事情相比,开始一个会话并不是什么大不了的事。通常,我认为不需要对此进行优化。每次只启动一个会话,或者只在相关页面上启动一个会话(例如,如果您有一些需要身份验证的后端页面,只需在那里启动会话)。当然,除了你每秒处理成千上万的用户。我测量了一个简单session_start()的大约需要0.1ms。

改进:正如 zerkms 下面建议的那样,如果 cookie 存在,或者站点想要写入会话,则启动会话将是管理此问题并且不会产生无用会话的最简单且防弹的方法。

于 2013-09-15T00:25:11.617 回答