这是今年第二篇关于WordPress提速性能优化的文章了,第一篇WordPress性能优化——提升网站速度飞起来教程在当时看来能将WordPress网站从5秒左右提速到1秒已是极限,我还沾沾自喜,如今看来那只能算是初级教程,今天给大家带来高级教程,别问我为什么不按初级中级高级的顺序写,因为我的博客想怎样写就怎样写!
大家以为WordPress的速度极限是多少秒?我见过最快的WordPress网站就是我爱水煮鱼的博客,号称0.0006秒生成页面,虽然生成速度很快,但在用户体验上的实际访问速度(这里指输入网址到浏览器展示出来的时间,即DOM解析速度)还是在300ms左右(实测与访客网络有关,在下渣渣移动3G网络)。当然,在第一次访问之后打开其它页面的速度几乎可以说是无缝切换。
目前代码狗博客的访问速度可以在500ms左右展现为了提升WordPress访问速度,站内页面间的切换可以说几乎做到了无缝切换,但相比于优化大神我爱水煮鱼来说还有许多不足之处,等我再研究一阵应该可以写出一篇终极优化教程来,这次WordPress性能提速优化我做了如下更改。
服务器方面
- Centos7.2 64位系统升级至Centos7.4 64位系统。
- Nginx1.11升级至Nginx1.12。
- PHP5.6升级至PHP7.2。
- MySQL5.4升级至MySQL5.6。
- Memcached1.3升级至Memcached3.0。
- 新增PHPOpcode字节码缓存。
- 新增Redis缓存。
WordPress缓存插件
-
Batcache缓存插件,它能将整个页面静态化,右键查看网页源码可以在网页底部看到绿色的缓存信息。下载好后取出其中advanced-cache.php文件放入wp-content/目录下,注意wp-content目录下,batcache.php文件放入wp-content/plugins/目录下,然后后台开启插件。下载地址:https://wordpress.org/plugins/batcache/
-
Memcached Object Cache缓存插件,取出其中object-cache.php文件放入wp-content/目录下,默认开启,无后台启动选项。下载地址:https://wordpress.org/plugins/memcached/
做好上面的部分再修改wp-config.php文件中的配置,如下(没有就直接添加即可)
define('ENABLE_CACHE', true);//开启memcached缓存 define('WP_CACHE', true);//开启默认缓存
好了,到这里再看看你的WordPress网站打开速度如何?一般来说如果上面的步骤都做了,你的WordPress网站打开速度应该在1秒以内,一般只需0.X秒即可打开网站,如果有图片等大资源,配上CDN会更快哟。到此sql查询次数也会降低至20次以内(各主题代码优化不一致,听说有的甚至能降低至2个sql查询,不知道他是怎么做到的很好奇,有知道身边有这样的朋友麻烦告诉他,他又多了一个粉丝)。
高级加速
上面部分应该可以算是WordPress性能优化提速的中级教程了,下面才是高级教程,学习下面的教程需要你的服务器支持memcached内存缓存,并且个人对WordPress函数有一定理解,否则改坏了程序,网站跑不起来别赖我,再提醒一句,一定要提前快照,切记!
在进入高级教程前我们需要先了解3个WordPress函数,它们分别是:
- wp_cache_set() 把数据写到缓存中。
- wp_cache_get() 读取缓存数据。
- wp_cache_delete() 删除缓存。
它们需要用到如下四个参数
这些函数会涉及到的四个参数:
- $key: 对象的 key。
- $data: 要存的值。
- $group: 分组,可选参数,用来把缓存对象就行分组。
- $expire: 过期时间,可选参数,如果是默认缓存,这个函数没用,如果是内存缓存,是设置缓存的时间,单位是秒,默认为0(0的意思就是永远,不会自动过期)。
基本使用
$data = wp_cache_get("缓存key",'缓存分组'); if(false === $data ){ $data = wp_get_related_posts();//缓存数据获取 wp_cache_set('缓存key',$data ,'缓存分组',3600); } echo $data ;
上面的代码意思是,当我们加载网页时会调用WordPress函数获取数据,遇到加载数据就先从缓存中取我们需要的数据,然后判断有没有从缓存中取出数据,没有就再通过查询获取数据,有就直接使用缓存数据,这样就避免了多次sql查询,减少查询次数,降低页面生成时间。
如果需要更新缓存,只需要删除原来的缓存数据,再次访问时会自动生成新缓存。
wp_cache_delete('缓存key','缓存分组');
好了,学会如何使用WordPress的缓存函数后,我们还需要对我们的主题进行调试DEBUG,上面的操作已经让我们的主题查询次数大大降低,比如我的大前端主题首页就从2200+查询降低至11次查询。怎么找到WordPress没有缓存的函数位置这里就不多讲了,我不是为了讲主题调试的。我在大前端主题header文件中找到5处不会自动生成缓存的地方,为了降低sql查询,我们就为这几处修改代码,实现缓存。
大前端dux主题中加载body标签的class时使用了body_class(_bodyclass())这个函数,这个代码不会被缓存,因为它会根据每个页面不同生成不同的class属性,应该就是这个原因导致WordPress没有对它进行缓存(我猜的),我们自己写上判断页面,然后使用上面的代码进行缓存与调用即可,原来查询11次,现在效果如下:
在修改主题时要注意一个问题,WordPress很多函数并不是以return形式返回数据,而是直接使用echo进行打印,因此,我们在对数据做如下操作时是错误的。
$data=body_class(_bodyclass());
body_class函数原型大家可以查一查,它就是使用echo直接输出的,当我们使用上面的代码赋值时是错误的,因为该函数没有给我们返回值,所以我们可以使用下面的方法:
ob_start();//打开一个缓冲区,打开之后下面的输出将会暂缓输出。 body_class(_bodyclass());//输出class,但在前面打开缓冲区之后,它会暂缓输出 $data=ob_get_contents();//取出数据缓冲区的值,赋值给我们的变量。 ob_end_clean();//关闭并清理缓冲区,这时我们的缓存已经写入了,因此关闭缓冲区并清理。 //WordPress的内存缓存写入。
优化完整个页面后,页面生成时间可以减低至0.02秒左右,不知为何我纯输出静态HTML首页都有6个查询,他们分别查询了options、posts、term_taxonomy、postmeta表。这是为何?难道0sql只有把整个网站静态化,根本不走数据库?希望有知道的大神指点。以上内容部分参考优化大神我爱水煮鱼,喜欢的话点个赞呗。
注意:如果做了缓存后查询次数仍然没有下降,请重启memcached缓存服务,最好直接重启服务器,我重启后首页查询次数直接降到了0,文章页2次。
评论 (10)