2015-08-12 3 views
1

Я создаю приложение с symfony2. У меня более 200000+ данных в моей базе данных. Для этого я использую сервер redis для повышения производительности, что фактически сократило время запроса доктрины. но все же мое время загрузки страницы составляет более 9 секунд, я размещал все css, js локально, чтобы проверить влияние времени загрузки, затем я понял, что мой контроллер занимает большую часть времени: вот код контроллера:Улучшение производительности контроллера в Symfony2

$episodesByContent = array(); 
    foreach ($episodes as $episode) { 
     if (!array_key_exists($episode['content_id'], $episodesByContent)) { 
      $episodesByContent[$episode['content_id']] = array(); 
     } 
     $episodesByContent[$episode['content_id']][] = $episode; 
    } 

    $data = array(); 

    foreach ($contents as &$content) { 

     $content['select'] = '<input type="checkbox" value="' . $content['id'] . '" id="'. $content['id'] . '" name="multiselect_checkbox" class="multiselect_checkbox">'; 
     $content['actions'] = ''; 
     if ($this->get('security.authorization_checker')->isGranted(array('ROLE_CONTENT_NEW_RO','ROLE_CONTENT_NEW_RW',' ROLE_CONTENT_GENERAL_RW'))) { 
      $link = $this->generateUrl('content_show', array(
       'id' => $content['id'], 
      )); 
      $content['actions'] .= '<a href="' . $link . '" rel="tooltip" title="Show" class="btn btn-info btn-sm btn-icon icon-left" role="button"> 
       <i class="entypo-info"></i> Show 
      </a>'; 
     } 
     if ($this->get('security.authorization_checker')->isGranted('ROLE_CONTENT_NEW_RW')) { 
      $link = $this->generateUrl('content_edit', array(
       'id' => $content['id'], 
      )); 
      $content['actions'] .= '<a href="' . $link . '" rel="tooltip" title="Edit" class="btn btn-default btn-sm btn-icon icon-left" role="button" onclick="return confirm(\'Are you sure?\')"> 
       <i class="entypo-pencil"></i> Edit 
      </a>'; 
     } 
     $data[] = $content; 


     if (array_key_exists($content['id'], $episodesByContent)) { 
      foreach ($episodesByContent[$content['id']] as $episode) { 
       $episode['select']   = ''; 
       $episode['priority']   = $content['priority']; 
       $episode['owner']    = $content['owner']; 
       $episode['sequence']   = $content['sequence']; 
       $episode['category']   = $content['category']; 
       $episode['category_sequence'] = $content['category_sequence']; 
       $episode['actions']   = ''; 
       $data[] = $episode; 
      } 
     } 
    } 



    $encoders = array(new JsonEncoder()); 
    $normalizers = array(new GetSetMethodNormalizer()); 
    $serializer = new Serializer($normalizers, $encoders); 
    $datatable = $this->get("bbd_datatables.content"); 
    $datatable->setData($serializer->serialize($data, "json")); 

Эта часть занимает 8 секунд. Может кто-нибудь предложить, как я могу уменьшить время загрузки контроллера?

и это вопрос, что им хранить в Redis кэш:

public function getContentList(){ 

    $cacheDriver = new RedisCache(); 
    $cacheDriver->setRedis(new Client()); 

     if ($cacheDriver->contains('_content')){ 
     return $cacheDriver->fetch('_content'); 
     } 

    $qb = $this->createQueryBuilder('c') 
     ->select('c.id, c.title, c.sequence, c.sequence_count, c.category_sequence, c.unique_id, c.priority, c.status, c.created_at,c.kaltura_id') 
     ->addSelect('o.slug as owner') 
     ->addSelect('cat.slug as category') 
     ->addSelect("group_concat(m.name SEPARATOR ',') AS media") 
     ->addSelect("group_concat(a.name SEPARATOR ',') AS album") 
     ->innerJoin('c.content_owner', 'o') 
     ->innerJoin('c.category', 'cat') 
     ->leftJoin('c.media', 'm') 
     ->leftJoin('c.albums', 'a') 
     ->groupBy('c.id'); 

    $query= $qb->getQuery()->getArrayResult(); 

    $cacheDriver->save('_content', $query, 3600); 

    return $query; 


} 

и в моем профайлер я вижу 15 запросов и 1035ms. это достаточно хорошо?

+0

написать запрос вручную – cmorrissey

+0

У меня нет другой опции, но для создания сложного запроса –

ответ

0

Как звонки на isGranted() не зависят от фактического $content, переместите эти вызовы из любого цикла, сохранив его в переменной.

Вы также должны избегать использования ссылок в петле foreach ($contents as &$content).