用Memcached、Batcache、Redis加速WordPress

这段时间从网友那了解到用缓存来给WordPress加速,以前有所耳闻但没有注意,经过试用后加速之后效果明显,现在把方法记录起来免得忘记。

Memcached:是一种高性能的分布式内存对象缓存系统。Batcache:WordPress启用Memcached这样的内存缓存之后,每次访问WordPress页面都要从内存中获取多个缓存对象。而Batcache主要就是解决这个问题,它是基于Memcached的WordPress缓存插件,它的工作原理是:把当前整个页面作为一个对象缓存到内存中,这样再次访问WordPress页面的时候,直接获从内存中获取这个对象即可,速度极快。Redis是一个高级的key-value存储系统,类似memcached,所有内容都存在内存中,因此每秒钟可以超过10万次GET操作。

说白了,就是当第一个访客访问你的博客,会从数据库等地方读取数据,而这个过程比较缓慢,当开启了缓存之后,直接把这些所读数据存储到内存里,当第二个访客点击时,服务器只需要读取内存中缓存的文件即可,内存和硬盘的速度差别很大,从内存里读取数据当然会更快,一点就开的感觉。

想要使用Memcached、Redis加速WordPress要有VPS,因为虚拟主机不支持,某些虚拟主机或许支持Memcached,但不一定支持Redis,有了VPS就有权限添加相应的扩展;本人并非专业人员,对代码不懂,用其他WEB环境管理起来老是要翻找教材,所以VPS我习惯使用宝塔面板,管理面板图形化让我更喜欢。

VPS以宝塔面板搭建WEB环境为例,安装好宝塔之后,SSH工具登陆VPS后运行下方代码并根据提示添加Memcached、Redis扩展:

wget -O ext.sh http://125.88.182.172:5880/ext/ext.sh && sh ext.sh

运行上方代码之后如下图:

选择安装的有第2个和第9个(本人装的php7,其他php版本需再安装第4个)根据提示安装即可。

第一个加速WordPress的方法:

安装上述所说的两个扩展和WordPress之后,可以用下方三个插件解决加速问题,在WordPress后台搜索安装即可:

MemcacheD Is Your Friend
Redis Object Cache
Batcache Manager

第二个加速WordPress的方法:

然而很多人不喜欢插件安装,最重要的是基于宝塔面板下经过本人测试,Redis Object Cache这个插件会导致和其他站点的Redis Object Cache冲突而导致其他站点废掉,下面就是基于三个插件:MemcacheD Is Your Friend、Redis Object Cache、Batcache Manager插件的免安装插件处女座修改方法:

下载 https://wordpress.org/plugins/memcached-is-your-friend/
从这下载插件并解压,把里面的memcached-class-object-cache.php重命名为object-cache.php
上传至/wp-content目录,如果是apache服务器,要在/wp-content/新建cache目录,权限改为777 (nginx服务器可忽略,就是不用新建cache目录也行)

下载 http://wordpress.org/extend/plugins/batcache/ 上传里面的 advanced-cache.php到/wp-content/目录

上述所说步骤做完之后,编辑博客根目录的wp-config.php 文件,添加下方两段代码进去并保存:

define('ENABLE_CACHE', true);
define('WP_CACHE', true);

如下图所示:

 解析:define('ENABLE_CACHE', true);这段是激活Memcached; define('WP_CACHE', true);是激活Batcache;

上方步骤完成之后,进入博客后台-插件-已安装插件,如下图所示,就已经开启了MemcacheD 缓存功能,试试打开速度,是不是飞快?

在这个基础上,还可以用Redis来缓存wordpress的执行代码提高请求速度,下面是使wordpress支持Redis的方法(需要SSH工具登陆VPS或服务器操作):

SSH工具登陆VPS后,定位到你的网站根目录,比如网站目录:/www/wwwroot/www.kaixinmeiju.com;运行下方命令定位到所需网站的根目录

cd /www/wwwroot/www.kaixinmeiju.com #请修改成你自己网站的实际目录)

然后运行下方命令下载所需的文件

wget http://uploads.staticjw.com/ji/jim/predis.php  

再运行下方命令修改权限

chown www.www ./predis.php 

再运行下方命令下载前端缓存的PHP脚本

wget https://gist.githubusercontent.com/JimWestergren/3053250/raw/d9e279e31cbee4a1520f59108a4418ae396b2dde/index-with-redis.php

修改权限

chown www.www ./index-with-redis.php

再用下方命令替换原网站目录的文件index.php,回车确定

mv index-with-redis.php index.php

至此大功告成,Redis缓存成功开启!做完这步,就同时开启了Memcached、Batcache、Redis来加速WordPress,这时远在美国机房的网站的WordPress速度照样飞快。

第三个加速WordPress的方法:

安装了Memcached、Redis扩展,还有简单且有效的方法:就是在后台安装一个Redis Object Cache插件并开启即可,稳定简单且快速,如下图:

第四个加速WordPress的方法:

可以下载Memcached Object Cache(https://wordpress.org/plugins/memcached/)到本地,解压文件里面有object-cache.php,将它上传到你的Wordpress的wp-content,将object-cache.php上传后,再安装Wordpress官方推荐的加速插件WP Super cache,进入WP Super cache高级设置中,就能看到:使用对象缓存系统来存储缓存文件。 (实验室功能),勾选保存即可。(如果上传文件后网站打不开就换个object-cache.php文件可以参照上方提到的:下载 https://wordpress.org/plugins/memcached-is-your-friend/从这下载插件并解压,把里面的memcached-class-object-cache.php重命名为object-cache.php上传至/wp-content目录)如下图:

总结:

第一个方法简单暴力,却因为太暴力出现兼容性问题,导致vps内的其他站点废掉,无其他站的单站点用户推荐。

第二个方法比较麻烦,兼容性好。

第三个方法简单高效,上述方案中是Memcached、Batcache、Redis同时上,感觉有点画蛇添足,所以非常推荐第三种方法。

第四个方法也是非常不错的方案。

至于其他更深入的修改本人感觉实在没有必要,针对web服务器的修改(比如ngx_cache_purge模块),修改的东西越多越不稳定,机房的选择比深入优化重要多了。

相关参考资料:

http://i.cuixt.com/1583.html Redis缓存加速wordpress,让页面飞起来!
http://i.cuixt.com/3113.html OneinStack使用ngx_cache_purge模块加速WP
https://iiong.com/database-cache-optimization.html 对数据库进行缓存优化
http://www.01happy.com/wordpress-redis-object-cache/ wordpress安装redis缓存插件,加速明显
https://www.freehao123.com/redis-wordpress/ 用Redis缓存来给WordPress站点加速
http://www.wopus.org/wordpress-deepin/tech/462.html 启用 WordPress object-cache 缓存
http://blog.wpjam.com/m/wordpress-memcached/ WordPress 如何启用 Memcached 内存缓存
http://blog.wpjam.com/m/batcache/ WordPress 内存缓存终极加速插件:Batcache

相关的WordPress插件推荐:

QQWorld自动保存图片
自动保存远程图片到本地,自动设置特色图片,并且支持机器人采集软件从外部提交。

Simple Lazyload
Lazy load all images without configurations. It helps to decrease number of requests and improve page loading time. 延迟加载所有图片,无需配置,有助于减少请求数,提高页面加载速度。

Watermark RELOADED
Add watermark to your uploaded images and customize your watermark appearance in user friendly settings page.

WordPress小工具里面添加随机文章,添加下方代码到主题的functions.php文件:

//随机文章小工具 
class RandomPostWidget extends WP_Widget 
{ 
 function RandomPostWidget() 
 { 
 parent::WP_Widget('bd_random_post_widget', '随机文章', array('description' => '我的随机文章小工具') ); 
 } 
 
 function widget($args, $instance) 
 { 
 extract( $args ); 
 
 $title = apply_filters('widget_title',empty($instance['title']) ? '随机文章' : 
$instance['title'], $instance, $this->id_base); 
 if ( empty( $instance['number'] ) || ! $number = absint( $instance['number'] ) ) 
 { 
 $number = 10; 
 } 
 
 $r = new WP_Query(array('posts_per_page' => $number, 'no_found_rows' => true, 
'post_status' => 'publish', 'ignore_sticky_posts' => true, 'orderby' =>'rand')); 
 if ($r->have_posts()) 
 { 
 echo "\n"; 
 echo $before_widget; 
 if ( $title ) echo $before_title . $title . $after_title; 
 ?> 
<ul class="line"> 
<?php while ($r->have_posts()) : $r->the_post(); ?> 
<li><a href="<?php the_permalink() ?>" title="<?php echo esc_attr(get_the_title() ? get_the_title() : get_the_ID()); ?>"><?php if ( get_the_title() ) the_title(); else the_ID(); ?></a></li> 
<?php endwhile; ?> 
</ul><?php 
 echo $after_widget; 
 wp_reset_postdata(); 
 } 
 } 
 
 function update($new_instance, $old_instance) 
 { 
 $instance = $old_instance; 
 $instance['title'] = strip_tags($new_instance['title']); 
 $instance['number'] = (int) $new_instance['number']; 
 return $instance; 
 } 
 
 function form($instance) 
 { 
 $title = isset($instance['title']) ? esc_attr($instance['title']) : ''; 
 $number = isset($instance['number']) ? absint($instance['number']) : 10;?> 
 <p><label for="<?php echo $this->get_field_id('title'); ?>"><?php _e('Title:'); ?></label> 
 <input id="<?php echo $this->get_field_id('title'); ?>" name="<?php echo $this->get_field_name('title'); ?>" type="text" value="<?php echo $title; ?>" /></p> 
 
 <p><label for="<?php echo $this->get_field_id('number'); ?>"><?php _e('Number of posts to 
show:'); ?></label> 
 <input id="<?php echo $this->get_field_id('number'); ?>" name="<?php echo $this->get_field_name('number'); ?>" type="text" value="<?php echo $number; ?>" size="3" /></p> 
<?php 
 } 
 
} 
add_action('widgets_init', create_function('', 'return register_widget("RandomPostWidget");')); 
?>

删除emoji表情和删除前台的s.w.org、删除文章自动删除文章所附带的图片

/* 删除文章时删除图片附件
/* ------------------------ */
function delete_post_and_attachments($post_ID) {
	global $wpdb;
	//删除特色图片
	$thumbnails = $wpdb->get_results( "SELECT * FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id' AND post_id = $post_ID" );  
	foreach ( $thumbnails as $thumbnail ) {
    	wp_delete_attachment( $thumbnail->meta_value, true );  
	}
	//删除图片附件
	$attachments = $wpdb->get_results( "SELECT * FROM $wpdb->posts WHERE post_parent = $post_ID AND post_type = 'attachment'" );
	foreach ( $attachments as $attachment ) {
    	wp_delete_attachment( $attachment->ID, true );  
	}  
	$wpdb->query( "DELETE FROM $wpdb->postmeta WHERE meta_key = '_thumbnail_id' AND post_id = $post_ID" ); 
}
add_action('before_delete_post', 'delete_post_and_attachments');

function remove_dns_prefetch( $hints, $relation_type ) {
if ( 'dns-prefetch' === $relation_type ) {
return array_diff( wp_dependencies_unique_hosts(), $hints );
}
return $hints;
}
add_filter( 'wp_resource_hints', 'remove_dns_prefetch', 10, 2 );

/**
 * Disable the emoji's
 */
function disable_emojis() {
    remove_action( 'wp_head', 'print_emoji_detection_script', 7 );
    remove_action( 'admin_print_scripts', 'print_emoji_detection_script' );
    remove_action( 'wp_print_styles', 'print_emoji_styles' );
    remove_action( 'admin_print_styles', 'print_emoji_styles' );
    remove_filter( 'the_content_feed', 'wp_staticize_emoji' );
    remove_filter( 'comment_text_rss', 'wp_staticize_emoji' );
    remove_filter( 'wp_mail', 'wp_staticize_emoji_for_email' );
    add_filter( 'tiny_mce_plugins', 'disable_emojis_tinymce' );
}
add_action( 'init', 'disable_emojis' );
/**
 * Filter function used to remove the tinymce emoji plugin.
 */
function disable_emojis_tinymce( $plugins ) {
    if ( is_array( $plugins ) ) {
        return array_diff( $plugins, array( 'wpemoji' ) );
    } else {
        return array();
    }
}

 

此条目发表在日志分类目录。将固定链接加入收藏夹。

3 则回应给 用Memcached、Batcache、Redis加速WordPress

  1. 豆采说:

    同宝塔,拜读了,折腾到了凌晨

  2. aleo说:

    advanced-cache.php 为啥用了这个以后前台后台直接都是白屏,这个要怎么解决!

  3. admin说:

    因为服务器环境不同,其实不用搞这么复杂,下载一个Redis插件即可。

发表评论

电子邮件地址不会被公开。

You must enable javascript to see captcha here!