如何利用缓存提高页面加载速度

互联网有一项著名的原则叫“8秒钟原则”,即首页的加载速度超过8秒,有70%的用户就会不耐烦,选择离开。

做网站或APP当然内容是王道,产品提供有价值的内容,才会吸引更多人使用;但如果加载过慢,纵然你的内容再好,也会有相当一部分用户流失。

相对于早期的“静态网页”,现在大家开发网站时都趋向于使用后端语言和数据库通信,为用户实时展现最新文章、最新评论的“动态网页”。这个理念是没错,可当用户访问量增多时,数据库通信将会严重拖慢页面加载速度。假设5秒钟之内有1000名用户访问了你网站的首页,如果你在这5秒没有更新任何内容的话,这1000人访问了1000次数据库,只为了得到一模一样的数据。999次数据库连接通信其实就是在浪费时间和资源。

“动态网页”和数据库的同步其实没必要精确到分和秒。服务器端如果有一个10分钟的缓存机制,将大大减少用户访问时的加载时间。据我的经验,有数据库通信,加载需要3秒钟的页面,使用缓存后可以缩短至600毫秒之内。

php里有一个很轻量、实用的工具叫phpfastcache,用起来简单的不要不要的,只需要$cache->get来获取缓存过的值,如果这个值不存在,那就去数据库里把它抓取出来,用$cache->set把值存入就好了。接下来的10分钟,所有用户访问都在服务器就可以解决,不用连数据库了。当然如果数据不会经常变化的话,缓存有效时间可以设置更久。

$results = $cache->get("identity_keyword");

if($results == null) {
    $results = cURL->get("http://www.youtube.com/api/json/url/keyword/page");
    // Write to Cache Save API Calls next time
    $cache->set("identity_keyword", $results, 60*10);
}

如何按相似标签(类别)的数量来排列相关文章?

如何在Wordpress网站的单页post或是custom post type(CPT) 中显示相关推荐?网上有很多教程教你怎么做。大体都是先得到当前post的类别或标签,然后到数据库里抓有相同标签的post出来。

对于一个小的、文章类型单一的博客,这种方法足够了,但对于结构复杂,同一篇post有多个标签时,我们要在有限的空间(一般不会超过10条)为用户提供最有价值的内容,就涉及优先级和排序的问题。如何判断一篇post和当前post的相关程度呢?

我能想到的最好办法就是按他们相同标签的数量来排序了。下面是我在名为商户(”business”)的CPT中显示相关商户推荐的例子。

首先,用wp_get_object_terms 得到当前商户的所有类别和标签数组,将其implode为string,然后运行query语句得出相关商户,按相同类别和标签数量多少来排序。

SELECT ID, COUNT(*) AS total_count, post_title  FROM `wp_posts` 
LEFT JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
LEFT JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
LEFT JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_posts.ID!=343131 AND wp_posts.post_type='business' AND wp_posts.post_status='publish' AND wp_terms.name IN ('中餐','粤港菜','茶餐厅简餐','奶茶甜点','果汁饮品','咖啡烘焙','早茶点心')
GROUP BY wp_posts.ID
ORDER BY total_count DESC

如何自定义 custom post type 的permalink

在WordPress添加custom post type之后,默认的permanlink组织形式是

http://example.com/post-type/post-name

如果想改为

http://example.com/post-type/%post_id%

应该如何做?根据网上搜到的教程,下面这段代码(以post_type=”business”为例)帮我实现了想要的功能。把它放入主题文件夹的functions.php或者专门新建一个插件都可以。插件激活之后要去访问一下后台permalink的设置页,不然新的permalink链接会有“页面无法显示”的错误。

add_filter('post_type_link', 'ct_post_type_link', 1, 3);

function ct_post_type_link( $post_link, $post = 0 ){
    $post_type = $post->post_type;

    if ( $post_type == 'business' ) {
        return home_url( "/$post_type/" . $post->ID);
    }else {
        return $post_link;
    }
}

add_action( 'init', 'ct_rewrites_init' );
function ct_rewrites_init(){
    add_rewrite_rule(
        'business/([0-9]+)?$',
        'index.php?post_type=business&p=$matches[1]',
        'top' );
}