WordPress 技巧:使用内存缓存提高 Postviews 效率

使用 WP-Postview 插件进行日志浏览数统计的时候,会有个问题,就是每个页面会多出三个 SQL 查询。这样每次浏览日志都会多出三次查询,对数据库其实是一次蛮大的负担,有没有办法解决这个问题呢?如果你和我一样网站启用了 Memcached 这类内存缓存组件的话,我们可以把日志的流量缓存到内存中,每次增加10次浏览才写入数据库中去。


<?php
/*
Plugin Name: WPJAM Memcached PostView
Plugin URI: http://blog.wpjam.com/m/memcached-postviews/ 
Description: 使用内存缓存提高 WP-Postviews 效率
Version: 0.1
Author: Denis
Author URI: http://blog.wpjam.com/
*/
add_action('init','wpjam_postviews');
function wpjam_postviews(){
    if(function_exists('the_views')){ //已经安装了 postview 插件
        global $wp_object_cache;
        if(isset($wp_object_cache->mc) && $wp_object_cache->mc){ //已经安装了 memcached 插件
            add_filter('update_post_metadata','wpjam_postviews_update_post_metadata',10,5);
            function wpjam_postviews_update_post_metadata($check, $object_id, $meta_key, $meta_value, $prev_value ){
                if($meta_key == 'views'){                    
                    wp_cache_set($object_id, $meta_value,'views'); 
                    $cached_post_views = 10;
                    if($meta_value%$cached_post_views == 0){ //每增加 10 次浏览才写入数据库中去
                        return $check;
                    }else{
                        return true;
                    }
                }else{
                    return $check;
                }
            }

            add_filter('get_post_metadata','wpjam_postviews_get_post_metadata',10,4);
            function wpjam_postviews_get_post_metadata($check, $object_id, $meta_key, $single ){
                if($meta_key == 'views' ){
                    $views = wp_cache_get($object_id,'views'); //显示的时候直接从内存中获取
                    if($views === false){
                        return $check;
                    }else{
                        return $views;
                    }
                }elseif($meta_key  == ''){
                    $views = wp_cache_get($object_id,'views'); 
                    if($views === false){
                        return $check;
                    }else{
                        $meta_cache = wp_cache_get($object_id, 'post_meta');
                        if ( !$meta_cache ) {
                            $meta_cache = update_meta_cache( 'post', array( $object_id ) );
                            $meta_cache = $meta_cache[$object_id];
                        }
                        $meta_cache['views'][0] = $views;
                        return $meta_cache;
                    }
                }else{
                    return $check;                    
                }
            }
        }
    }
}

将上面的代码复制到当前主题的 funtions.php 文件中,或者直接当做一个插件上传激活即可。

使用内存缓存日志的浏览数,如果不小心把将内存缓存的数据清掉,日志的浏览数会丢失一部分,但是肯定少于10了。 WordPress 技巧:使用内存缓存提高 Postviews 效率