2014-07-03 42 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日志将被创建,昂贵的对象反射可能被请求多次,特别是如果你击中警告,例外或非致命错误,所有这些将会使延长。