代码之家  ›  专栏  ›  技术社区  ›  Alex

函数会话_start()出现问题(工作缓慢)

  •  4
  • Alex  · 技术社区  · 15 年前

    我有个问题 session_start() 在主服务器上。当我第一次加载页面时,完成请求需要不到1秒的时间。如果我等待大约12-15秒,然后重新加载页面,加载时间将相同。但是,当我尝试在初始加载后3或5秒刷新页面时,服务器的响应时间等于10秒。

    我做了一些测试来定义我的脚本中的瓶颈,我发现,这个函数 SistSuxSistar() 执行9.8秒。我正在使用Pear包http_session2。 下面是代码段:

    HTTP_Session2::useCookies(SESSION_USE_COOKIE);
    /* Next line was added to make logging of execution time possible. */
    self::writeToFile('HTTP_useCookies(1) -> '.self::getWorkTime()); 
    HTTP_Session2::start("SID");
    self::writeToFile('HTTP_start(2) -> '.self::getWorkTime());
    HTTP_Session2::setExpire(time() + SESSION_EXPIRE);
    self::writeToFile('HTTP_setExpire(3) -> '.self::getWorkTime());
    

    日志文本:

    //First loading (13:34:35)
    HTTP_useCookies(1) -> 0.00038
    HTTP_start(2) -> 0.00077
    HTTP_setExpire(3) -> 0.00090
    
    // Second loading (13:34:39)(4 seconds later)
    HTTP_useCookies(1) -> 0.00029
    HTTP_start(2) -> <<<<<< 10.80752 >>>>>
    HTTP_setExpire(3) -> <<<<<< 10.80780 >>>>>
    
    //Third loading (13:34:56)
    HTTP_useCookies(1) -> 0.00041
    HTTP_start(2) -> 0.00071
    HTTP_setExpire(3) -> 0.00083
    

    所以我发现问题出在 HTTP_Session2::start() 功能。功能代码 http_session2::start()。 以下内容:

    public function start($name = 'SessionID', $id = null)
    {
      self::name($name);
      if (is_null(self::detectID())) {
        if ($id) {
          self::id($id);
        } else {
          self::id(uniqid(dechex(rand())));
        }
      }
      session_start();
      if (!isset($_SESSION['__HTTP_Session2_Info'])) {
        $_SESSION['__HTTP_Session2_Info'] = self::STARTED;
      } else {
        $_SESSION['__HTTP_Session2_Info'] = self::CONTINUED;
      }
    }
    

    我不明白什么是造成时间延迟的原因。服务器上可能有错误的Apache设置。或者,可能,对包含会话信息的文件有一些“锁”。

    也许,有人已经遇到了这样的问题,可以帮助解决它。

    1 回复  |  直到 9 年前
        1
  •  13
  •   Pascal MARTIN    15 年前

    包含会话信息的文件在PHP服务请求期间被锁定。

    因此,如果您有一个当前正在执行的PHP脚本(使用会话),并且同一个用户发送另一个请求,那么第二个请求将一直等到第一个请求完成。