2009-12-16 45 views
3

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

我做了一些测试,以定义我的脚本中的瓶颈,我发现,功能session_start()执行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设置。或者,也许对会话信息的文件有一些“锁定”。

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

+0

相关http://stackoverflow.com/q/13772074/168034 – phunehehe 2014-09-22 09:19:28

回答

10

包含会话信息的文件在PHP提供请求期间被锁定。因此,如果您有一个当前正在执行的PHP脚本(使用会话),并且同一用户发送另一个请求,则第二个请求将一直等到第一个请求完成。

+0

但是当我发送另一个请求时,请求已经完成。 – Alex 2009-12-16 12:21:56

+0

我刚刚发现,有一个更多的请求到服务器,加载整个页面后开始。所以会话文件确实被锁定,但我无法定义在哪里。这就是为什么我想到了Apache设置。非常感谢,帕斯卡。 – Alex 2009-12-16 14:50:17

+0

谢谢帕斯卡尔马丁,因为这个,我遇到了巨大的性能问题。所以如果你有'session_start()的file1.php; sleep(10);'并且运行第二个脚本file2.php,这个脚本也将等待来自file1的睡眠。 – adrianTNT 2013-08-19 19:06:43