2011-04-16 72 views
0

我有一個使用CodeIgniter編寫的web應用程序,大部分情況看起來相當合理。但是,當用戶註銷時,我注意到了非常高的CPU使用率。我的驗證控制器中的註銷功能如下:CodeIgniter - ses_destroy()使用很多CPU

function logout() 
{ 
    $goto = $SERVER['HTTP-REFERER']; 
    $this->session->sess_destroy(); 
    if (!$goto) 
     $goto = "/"; 
    header('location: '.$goto); 
} 

通常情況下,這是非常好的和快速的。奇怪的是,當從一個特定的子頁鏈接到時,這個函數在mysqld運行在100%cpu下需要大約5-6秒的時間。我怎樣才能看到它在做什麼,爲什麼?

+0

嘗試評論了'sess_detroy()'調用,以確保它是什麼讓這個緩慢;當你確定它的時候,你需要告訴我們更多關於這個方法的用途。 – 2011-04-16 19:32:01

+0

當我調用sess_destroy()時,我不確定究竟發生了什麼,它只是銷燬會話的CodeIgniter方法。 – Mala 2011-04-16 19:33:12

回答

2

以在黑暗中拍攝(如果你確定這個功能是導致緩慢):

首先,你可以打開MySQL的慢查詢日誌:

http://dev.mysql.com/doc/refman/5.1/en/slow-query-log.html

然後,如果$sess_use_databaseTRUE,您可以嘗試優化會話表。你可能會有一些開銷導致問題。

除此之外,我唯一能想到的其他事情是數據庫服務器存在問題。你可以嘗試運行MySQL的調諧器,看看是否可以改善的事情一點:

https://github.com/rackerhacker/MySQLTuner-perl

希望幫助!

FYI

這裏是代碼在運行時的OP運行sess_destroy()(從V2.0.2):

/** 
* Destroy the current session 
* 
* @access public 
* @return void 
*/ 
function sess_destroy() 
{ 
    // Kill the session DB row 
    if ($this->sess_use_database === TRUE AND isset($this->userdata['session_id'])) 
    { 
     $this->CI->db->where('session_id', $this->userdata['session_id']); 
     $this->CI->db->delete($this->sess_table_name); 
    } 

    // Kill the cookie 
    setcookie(
       $this->sess_cookie_name, 
       addslashes(serialize(array())), 
       ($this->now - 31500000), 
       $this->cookie_path, 
       $this->cookie_domain, 
       0 
      ); 
} 
+0

我確實使用'$ sess_use_database',但爲什麼我的其他數據庫表對清除會話表中的條目有任何影響?感謝MySQL慢速查詢日誌上的鏈接,我會檢查它 – Mala 2011-04-16 19:37:03

+0

我不確定其他表,但如果會話表中存在高碎片,可能會導致緩慢。 – 2011-04-16 19:42:19

+0

我將此標記爲已接受,因爲「優化我的餐桌」讓我不再有問題了......感謝您的建議!我在一個2列的0行表上有一個兩列的主鍵索引...刪除*似乎*使問題消失,儘管我不知道爲什麼= \ – Mala 2011-04-16 19:43:01