2009-12-16 68 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