记一次wordpress性能优化
wordpress真的很流行,但是我真的不认为它的性能好,尤其当数据超过几万十几万的时候。当然作为一个个人博客来说超过几万的数据是一件很难的事情。可我现在用wordpress作为CMS使用,数据库中有十几万条数据。
新租的云主机配置为:2核2GHZ的CPU、1G内存、CentOS6.4操作系统。安装完Apache、php、MySQL后导入数据打开首页一看,竟然用了十几秒的时间才打开首页。经过研究发现主要是php生成页面很慢,猜测可能是数据库查询比较慢,另外页面加载也有需要优化的地方。因此我做了一系列的优化,主要集中在以下几点:
1.数据库参数调整。
2.启用数据库查询缓存。
3.增加索引以提高查询效率。
4.使用eaccelerator提高php执行速度。
5.优化文件加载。
第一步:调整MySQL参数。
调整参数我是参考my-medium.cnf文件进行的,该文件中有详细的说明,在此不再详细说明。
第二步:打开MySQL的通用查询日志和慢查询日志。
打开方法在MySQL配置文件中加入如下两条配置项并重启MySQL服务使其生效。
log=/var/log/mysql/log.log long-query-time=0.02 slow_query_log=/var/log/mysql/slow.log
刷新几次页面并分别观察两个日志。
通过观察通用查询日志发现每个页面生成都要有很多次数据库查询,其中大部分是不需要每次打开一个页面就需要查询的,如从wp_options表中获取option。所以需要开启MySQL的查询缓存,方法为在MySQL配置文件中加入如下配置项:
query-cache-type=1 # 0:不启用查询缓存;1:默认缓存,除非在SELECT语句中指定SQL_NO_CACHE;2:默认不缓存,除非在SELECT中指定SQL_CACHE; query_cache_limit=3M # 缓存的最大单个查询结果集。 query_cache_size=64M # 查询缓存可用的最大内存。 query_cache_min_res_unit=0k # 缓存的最小查询结果集。 query_cache_wlock_invalidate=0 # 1:写锁定发生在表上时该表的查询缓存立即失效; 0:写锁定发生在表上时写锁定期间查询缓存仍然有效。
重启生效后刷新几次页面以及打开其他页面,页面的整个加载时间在两秒左右,其中页面生成时间在一秒以上,相比之前来说可以说是立竿见影。
query_cache_size参数其实并不需要这么大,对于wordpress来说我只是想缓存一些结果集不易变的细碎查询,对于文章详细页和文章列表页做缓存实在是不现实,所以此处16M足矣(当时我给的太大了)。
不必要的WHERE条件
第三步:增加索引
根据查询WHERE条件中的字段添加索引。
第四步:提高PHP执行效率。
众所周知,PHP的执行效率相对来说还是比较低的,wordpress又是一个比较复杂的博客系统,性能一直马马虎虎。我们自己动手优化wordpress代码不怎么现实,所以我想到了用eaccelerator来提高PHP执行效率。eaccelerator的官方网址为 https://github.com/eaccelerator/eaccelerator/。其官方简介如下
eAccelerator is a free open source PHP accelerator and optimizer for PHP. It increases the performance of PHP scripts by caching them in compiled state, so the overhead of compiling is almost completely eliminated. It also optimizes the scripts to speed up execution. eAccelerator typically reduces server load and increases the speed of your PHP code by 1-10 times.
官方文档中有详细的安装和配置方法,请参考官方文档那个进行。
安装完成后又刷新了一下页面,生成页面的速度降低到两三百个毫秒。
两三百个还秒对于当前使用的主机我已经很满意了。
第五步:页面加载也要做一些优化,css和js该合并的合并,该压缩的压缩。图片该合并的合并,不必要的资源停止加载。对于现代浏览器支持的manifest缓存也适当的应用上了,将图片、css、js等静态资源直接缓存到客户端。
后记:
我也找了一些wordpress优化插件,如WP Super Cache等,虽然有一定的效果,但是依然没有痛快的感觉。
另外对于所有的php+MySQL应用来说这些经验都是可以借鉴的。