加速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这里还有蛮多,其它的以后遇到了再过来加。
当初为了不调用这个函数(删除缓存用),我想了好多办法,这样调用很容易造成多级循环的对数据库进行嵌套查询,效率那是非常的低
get_permalink这个函数何止一次数据库查询啊。
按照推荐的/%year%/%monthnum%/%postname%来算的话,那个函数调用一次,需要3次数据库查询。你那个例子,要31次数据库查询。
但是这个函数却保证了对每一个博客都能正确生效。
给别人写插件的话不可避免的要用这个的。
我发现了,实际上情况并不总是那么糟糕,如果在the loop里面调用get_permalink的话,由于使用了缓存,所以,不会增加新的数据库查询。但是在侧边栏插件的话,那个函数真的很恐怖。我按照你说的去优化了一下,直接节省了42%的query数量。
解决办法就是修改get_permalink的实现
具体如何修改?请具体讲讲
我用的方法是另外写一个get_permalink的替代函数get_permalink_ster,由于我的permalink比较简单,所以这个函数内容就是 return get_settings("home").'/posts/'.$post->post_slug.".html"类似的。
然后在需要使用get_permalink的地方都改为调用get_permalink_ster。
可能还有更高级的方法,你可以咨询你楼上。