加速blog:优化WordPress程序效率

这里本质上要谈的还是优化数据库的效率,不过是改写WordPress的代码使得降低数据库查询次数。

get_permalink函数

get_permalink函数非常好用,get_permalink($id)便能直接得到文章ID为$id的永久链接,所以在显示文章列表中常常用到。比如类似下面这个显示最近10篇文章列表的函数,很多人都用到了吧:

<?php
function get_recent_posts () {
  global $wpdb, $tableposts;
  $request = "SELECT * FROM $tableposts WHERE post_status = 'publish' ";
  $request .= "ORDER BY post_modified DESC LIMIT 0, 10";
  $posts = $wpdb->get_results($request);
  $output = '';
  foreach ($posts as $post) {
    $post_title = stripslashes($post->post_title);
    $permalink  = get_permalink($post->ID);
    $output .= '<li><a href="' . $permalink . '">' . $post_title . '</a></li>';
  }
  echo $output;
}
?>

但不知道有多少人知道调用上面这个函数将产生11次的数据库查询?你只看到了一次?另外10次就在get_permalink的调用里面,不信你去读一读get_permalink函数的实现。阅微堂以前的数据库查询次数高达60多,就是这玩意儿弄出来的,我随便改了一下,就降了30次(我有3个列表 :) )。

解决办法就是修改get_permalink的实现,毕竟很多人的permalink结构都很简单。也没有必要真的去修改get_permalink的源代码,这样升级起来比较麻烦。另外写一个类似的函数,每次需要时使用这个新的函数即可。

WordPress效率问题剖析及重写WordPress这里还有蛮多,其它的以后遇到了再过来加。

关于 »
  • 加速blog:减少和优化插件 尽量少用含javascript和css的插件 很多插件作者需要为blog的慢速度负责。插件作者随意地往'wp_head'里安插js和css,导致很多blog的head部分越来越臃肿。 ...
  • 加速blog:速度检测 本文隶属加速blog系列 既然我们要谈加速blog,第一重要的是给blog的速度一个量化的评价。 Firefox的fasterfox插件会在Firefox的右下角给出每个网页的载...
  • 加速blog:监测和优化WordPress数据库 在WordPress生成页面时,最消耗时间的便是数据库查询了。 监测WordPress的数据库查询 WordPress内置了数据库缓存系统,安装插件WordPress Cache Inspect,它会...
  • 加速blog:选择合适的服务器 要想打造一个响应快速的blog,一个快速的服务器(虚拟主机空间)是必不可少的。其实这才是决定因素,因为这可能会导致速度在数量级上的差距(我...
  • 加速blog:WordPress的缓存和静态化 WordPress消耗时间最多的便是数据库的查询,所以缓存是一个比较好的解决方案。WordPress强大的'hook'机制,使得可以为之建立强大的缓存机制,从缓存数...
  • 加速blog:网站响应缓慢的因素 本文隶属加速blog系列  为什么有的网站即点即开,有些却慢得要死?影响网站速度的因素有但不限于下面这些:许多因素会影响到网页初次访问的响...
  • 加速blog:设置浏览器缓存 在用户浏览blog的不同页面时,很多内容是重复的,比如相同的javascript,css,背景图片等。如果我们能够建议甚至强制浏览器在本地缓存这些文件,将...
  • 加速blog:分析页面内容 用FTP更新WordPress的可能有体会,如果是打包上传的话,速度很快,但如果解压后一个文件一个文件上传的话,可能就要好几分钟。 下载也是如此,不...
  • 加速blog:处理页面图片 作为文章的或者功能性的或者美学意义上的需求,现在blog越来越丰富多彩,图片也越来越多。 选择合适的图片尺寸 现在数码相机越来越好,动辄800...
  • 加速blog:HTTP Header 本文隶属加速blog系列 HTTP请求和相应Header 一个经典的HTTP连接是,读者通过浏览器(下称为浏览器端),向服务器(下称为服务器端)申请浏览某网页...
6条留言 -> 跳到留言表格
  • At 2008.01.07 10:01, cosbeta said:

    当初为了不调用这个函数(删除缓存用),我想了好多办法,这样调用很容易造成多级循环的对数据库进行嵌套查询,效率那是非常的低

    • At 2008.06.09 01:15, Charles said:

      get_permalink这个函数何止一次数据库查询啊。
      按照推荐的/%year%/%monthnum%/%postname%来算的话,那个函数调用一次,需要3次数据库查询。你那个例子,要31次数据库查询。
      但是这个函数却保证了对每一个博客都能正确生效。
      给别人写插件的话不可避免的要用这个的。

      • At 2008.06.09 02:32, Charles said:

        我发现了,实际上情况并不总是那么糟糕,如果在the loop里面调用get_permalink的话,由于使用了缓存,所以,不会增加新的数据库查询。但是在侧边栏插件的话,那个函数真的很恐怖。我按照你说的去优化了一下,直接节省了42%的query数量。

        • At 2008.09.24 11:00, 天涯行客 said:

          解决办法就是修改get_permalink的实现
          具体如何修改?请具体讲讲

          • At 2008.09.24 11:11, zhiqiang said:

            我用的方法是另外写一个get_permalink的替代函数get_permalink_ster,由于我的permalink比较简单,所以这个函数内容就是 return get_settings("home").'/posts/'.$post->post_slug.".html"类似的。

            然后在需要使用get_permalink的地方都改为调用get_permalink_ster。

            可能还有更高级的方法,你可以咨询你楼上。

          • At 2009.06.20 20:32, 随影 said:

            呵呵 函数很有用啊!! :-)

            (Required)
            (Required, not published)

              B | I | U | D | 添加链接 | 插入引用 | 插入代码 | 插入表情 | | + | ?
            guest | 注册 | BBS | 管理 | English | 繁體 | https

            阅微堂

            zhiqiang's personal blog
            Loading...
            Loading...
            Loading...