В общем есть функция рисовалки дерева категорий. Не суть важен её код сейчас. к каждой категории я вызываю функцию подсчета количества новостей в ней. Следовательно будет (колличество категорий)*(колличество запросов в функции)? у меня где - то 50 категори. следовательно 1 дерево жрёт 50 запросов как минимум при генерации. помогите советом. просто задумался об оптимизации, код писал когда только начинал кодить. функция подсчета: PHP: function countfile($category){ $s = checkrazdel($category); $dsds=parse_array($s); $cc=mysql_num_rows(mysql_query("SELECT id FROM news WHERE category='$dsds' AND onsite='1'")); return $cc; } ах да, там еще функция проверки родительских категорий, это еще 1н запрос. время генерации всего сайта 0.03 сек. нужен совет
у меня такая же штука в админке, выводится сразу все рекурсивной функцией, тоже много запросов, сейчас буду кешировать все это дело куда нибудь: PHP: <?php public function buildTree($pid, $root = ''){ $childs = ''; $query = "SELECT * FROM `cat_tree` WHERE pid = $pid ORDER BY `name`"; $result = $this->registry['db']->query($query); while($row = $result->fetch_assoc()){ $steps = count(explode("/", $row['path'])); $childs = $this->buildTree($row['id'], $childs); $this->registry['view']->setPath('template/admin/childs.html'); if($steps >= 4){ $this->registry['view']->setPath('template/admin/last_child.html'); } $this->registry['view']->setVar('id', $row['id']); $this->registry['view']->setVar('name', $row['name']); $this->registry['view']->setVar('pid', $row['pid']); $this->registry['view']->setVar('childs', $childs); $root .= $this->registry['view']->prepare(); $childs = ''; } return $root; }
в общем сделал вот так: PHP: <?php class FileCache{ /* *типа кэш */ private $cache = null; /* * время протухания * в секундах */ private $updateTime = null; /* * путь до файла с кэшем */ private $path = ''; /* * нужно или не нужно кешировать * bool */ private $needCache = null; /* * путь файла * и время протухания */ public function setCacheOtions($path, $updateTime = null){ $this->path = $path; $this->updateTime = $updateTime; $this->needCache = $this->checkCache(); } /* * получить */ public function getCache(){ $this->readCache(); return $this->cache; } /* *сохранить */ public function saveCache($data){ file_put_contents($this->path, $data); } /* * возвращает bool */ public function needCache(){ return $this->needCache; } private function checkCache(){ if(!file_exists($this->path)){ touch($this->path); chmod($this->path, 0644); return true; } if($this->updateTime != null){ $time = time(); $rottenTime = filemtime($this->path) + $this->updateTime; if($time > $rottenTime){ return true; } } return false; } private function readCache(){ $this->cache = file_get_contents($this->path); } } ?> PHP: <?php public function showCategory(){ $cacher = new FileCache(); $cacher->setCacheOtions("cache/categorytree.html"); if($cacher->needCache()){ $tree = $this->buildTree(1); $cacher->saveCache($tree); } else{ $tree = $cacher->getCache(); } $this->loadContent($tree); } без с когда категорий будет 300-400 будет ощутимее думаю еше можно по времени PHP: <?php $cacher = new FileCache(); $cacher->setCacheOtions("cache/test.html",10); if($cacher->needCache()){ $data = time(); $cacher->saveCache($data); } else{ $data = $cacher->getCache(); } echo $data; если файла нет то сам создаст
в общем после поста с товарищем написали функцию, которая сначала забирает все категории, гонит их в массив, потом парсит по конечной категории и выводит дерево. в общем на раздумие ушло 5 часов ( на 2 головы ). -100, примерно, запросов к базе. время генерации составляет 0,00606 среднее. в общем огромный контент тянется 3мя запросами.
Если использовать Redundant Adjacency List, то можно взять дерево и подсчитать сумму по категории одним запросом.