PHP:仅在必要时启动会话


PHP: start session only when necessary

我有自己的会话类,它处理会话操作。我想建立一种机制,即会话仅在需要时启动 - 如果未设置会话变量,系统不会创建它。

这就是代码(简化):

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 存在或站点想要写入会话,则启动会话将是管理此问题的最简单且防弹的方法,并且不会生成无用的会话。