如何使我的3级层次结构快速加载

时间:2014-03-08 12:29:11

标签: php mysql tree hierarchical-data

以下是我从数据库获取数据的方式。它是一个3级层次结构。父母,孩子和孩子的孩子。

page_id | parent_id 
    1         0          
    2         1
    3         0
    4         3

顶部数据显示0为父级。

$id = 0;
public function getHierarchy($id)
   {
       $Pages = new Pages();
       $arr = array();
       $result = $Pages->getParent($id);

       foreach($result as $p){
           $arr[] = array(
               'title' => $p['title'],
               'children' => $this->getHierarchy($p['page_id']),
               );
       }
       return $arr;
   } 

到目前为止,我正在获取数据,但它有点慢。浏览器在显示数据之前加载了很长时间。如何让我的代码更快,以便浏览器加载数据不需要很长时间?

感谢。

1 个答案:

答案 0 :(得分:1)

您有多种方法可以加快速度:

  1. 从表中选择所有行,仅在PHP上执行递归 侧。如果表中没有太多行,那么它只是一个选项。
  2. 你可以自己加入桌子。如果您知道将来不再有层次结构,这是一个不错的选择。查看帖子:http://blog.richardknop.com/2009/05/adjacency-list-model/
  3. 使用嵌套集:http://en.wikipedia.org/wiki/Nested_set_model
  4. 或者我最喜欢的:Closure Table
  5. 使用某种缓存。例如,您可以缓存db查询或整个树菜单html或PHP数组。
  6. 缓存示例:

    您可以使用普通文件进行缓存,也可以使用memcachememcachedapc等专用API。 通常你有一个有3种基本方法的课程。界面可能如下所示:

    interface ICache
    {
        public function get($key);
        public function set($key, $value, $lifetime = false);
        public function delete($key);
    }
    

    您可以像以下一样使用它:

    public function getHierarchy($id)
    {
        $cached = $this->cache->get($id);
        if (false !== $cached) {
            return $cached;
        }
    
        // run another method where you build the tree ($arr)
    
        $this->cache->set($id, $arr, 3600);
    
        return $arr;
    }
    

    在示例中,树将缓存一小时。如果将另一个项目插入数据库,也可以设置无限生命周期并删除密钥。