2014-07-03 72 views
0

它讓我很惱火,以下查詢在被AJAX請求啓動時需要1秒的時間來處理頁面刷新期間調用(同步)時僅需要2 ms的時間。我花了幾個小時來追查哪裏出了問題,但我很無奈。我已經嘗試了Model-> read,Model-> find,Model-> query(),但它需要相同的時間。我認爲1秒這樣的簡單查詢並不自然。可能是CakePHP模型浪費太多資源和時間。但我的直覺說它與查詢緩存有關。CakePHP查詢 - 意外的大延遲

protected function _user_info($id= NULL){ 
      //benchmarking 
    $time = -microtime(true); 

    if(!$id){ 
     if($this->Auth->loggedIn()) 
      $id = $this->Auth->user('id'); 
     else 
      return NULL; 
    } 
    $this->loadModel('User'); 
    /*$findOptions = array('conditions'=>array('User.id'=>$id), 
     'fields'=>'User.id, User.name, User.email, User.role, dp', 
     'limit'=>1, 
     'recursive'=>-1); 
    $r = $this->User->find('first', $findOptions); 
    */ 
    $r = $this->User->query("SELECT * FROM users WHERE id = '".$id."' LIMIT 1"); 
    $time += microtime(true); 
    echo '<h1>'.$time.'</h1>';  //out- time taken for the query 
    return $r['User']; 
} 

任何形式的幫助都會很棒!

+1

你真的不應該使用'query()' - 而是使用'find()'。 – SharkofMirkwood

+0

你的基準測試需要多行。你應該縮小它,以便確切知道哪條線需要很長時間。 –

+0

@ joshua.paling - 我已經嘗試了所有基準測試,然後分組!它可以是'find()'或'query()',它需要一秒鐘來處理。 – Killswitch

回答

0

首先,嘗試正常蛋糕搜索風格:

// You should have containable 
$this->User->contain(); 
$r = $this->User->find('first',array('conditions'=>array('id'=>$id))); 

測試它。 乾杯。

+0

你應該詳細說明你的答案,更多的解釋爲什麼這是「正常的蛋糕搜索風格「,也許提供一些更多的信息,例如從文檔。 –

+0

如果你閱讀doc,你會看到,爲什麼這是蛋糕搜索風格。你不會在doc中經常看到這段代碼:$ this-> User-> query(「SELECT * FROM users WHERE id ='」。$ id。「'LIMIT 1」); –

0

如果你在debug 2你不計算執行時間,但也調試開銷。

調試啓用高速緩存將不會長時間使用,這將意味着數據庫將被要求DESCRIBE表,一個SQL日誌將被創建,昂貴的對象反射可能被請求多次,特別是如果你擊中警告,例外或非致命錯誤,所有這些將會使延長。