很多同学都说 WordPress 很慢,前面我发布的插件 WPJAM Debug,可以在页脚显示当前页面有多少条 SQL 查询,页面生成花了多少时间,并且把 SQL 按照执行顺序和按照耗时列出,可以通过这样的方式帮你分析 WordPress 哪里慢。
但是 WPJAM Debug 只是分析 WordPress 效率,具体涉及到 WordPress 性能优化,还需要自己动手来做,今天我就讲讲这一段时间来我工作的网站:App每日推送(也是基于 WordPress 构建)是怎么优化的。
关于 App每日推送
App每日推送是基于 WordPress 构建的 iPhone/iPad 应用推荐服务,这是目前我做过最复杂的 WordPress 网站,有多重筛选:可以通过设备(iPhone/iPad/通用),价格(免费/限免/收费)分类(游戏/应用/工具等等)选择自己喜欢的 App,用户动态,讨论区,消息通知,积分,积分兑换等等功能。
目前整个网站每个月的流量已经超过 300W,但是网站目前的速度很快,大部分页面在 0.1 秒内生成,并且只有 2 条 SQL 查询,比如首页:2 queries in 0.063 seconds。
那么我们是怎么进行优化的?
服务器优化
首先要选择一个靠谱的主机托管商,在国内这个很多时候让你抓狂,但是只要努力还是可以的,第二选择 BGP 或者多线机房,让全国用户访问都能有不错的速度,第三选择独立的服务器,再不行,也要选择 VPS,因为你没有服务器的 Root 权限很多东西是无法进行的,个人博客可以考虑 Media Temple 这类的 VPS 主机。
服务器问题解决之后,服务器可以做如下优化:
1. Web 服务器选择使用 Nginx:效率和并发比 Apache 高,系统资源消耗低。
2. MySQL 设置 MySQL Query Cache,可以保存保存查询结果,同样的查询不再从数据库检索,对速度有很大的提升。
3. 使用 eAccelerator 加快 PHP 脚本的执行效率:把经过编译后的 PHP 代码缓存到共享内存中,并在用户访问的时候直接调用从而起到高效的加速作用。
WordPress 程序优化
WordPress 插件一定要只用必须的,另外尽量能够全部插件自己写,如果不能全部自己写,也要对第三方插件按照自己需求进行改写,
WordPress 主题代码的质量一定要保证,尽量使用模板函数,比如 get_the_terms 和 wp_get_object_terms 这两个函数,功能基本一样,但是get_the_terms 直接从缓存中取数据,无查询,而 wp_get_object_terms 每次都从数据库中取数据,不用说,肯定第一个效率更好。
WordPress 缓存
关于 WordPress 缓存我已经做过详细的总结,这里就不再累赘,具体涉及到 App每日推送,由于动态网站的特性,注册用户比较多,不适合 WP Super Cache 这样的静态缓存,对硬盘读写太多,讨论区又无法缓存,我们使用 Memcached 和 Batcache 搭配的内存缓存模式:
对于已登陆的用户,Memcached 会把 Object Cache 的对象存到内存里面,服务器的内存足够大,读取和存储速度也够快,并且内存缓存命中率也大于 93%。另外我们 WordPress 程序经过优化,每个页面的查询一般在 2 条左右,所以整个网站效率很高。
对于未登录的用户,Batcache 会把整个页面当做一个对象存到内存里面,未登录用户访问的时候,整个页面从内存中取出,速度奇快。
WordPress 性能优化总结
选择好的服务器和托管商,对 WordPress 程序进行优化,并且做好缓存,WordPress 效率其实很高的,加上 WordPress 本身的灵活性和功能强大,WordPress 作为各种建站绝对是非常不错的选择。
另外这里还有一份我总结的关于 WordPress 性能优化的 PPT: http://vdisk.weibo.com/s/2QR2M,内容略有补充。

请问“app每日推送”的memcached大概消耗多少内存?这样一个访问量的站点内存需要多大合适?
100M 左右!
另外访问量和内存大小需求没有关系!
请问一下大虾,您提到的App每日推送的多重筛选(设备,价格,分类等维度)功能是用什么插件实现的?插件是英文版还是中文版的?设置操作方便不?这个很酷啊。。。我也想在wordpress上试试这个东东
WP 的默认功能开发,Custom Taxonomy
多谢Denis回复。。。
“WP 的默认功能开发,Custom Taxonomy”
您这句话意思是说,要做一些coding开发的工作才能实现多重筛选?没有什么插件可以直接实现吗?
插件我不知道,我们都是自己写代码的,你要去搜索下,一般是添加了 Cusetom Taxonomy,然后 WP 就默认支持多重筛选了。
比如定义了 device 和 price 这两个 taxonomy,然后加上默认的 category_name ,可以自己定义下面的url:
http://appdp.com/?category_name=games&device=iphone&price=price-drop
WP 会自动筛选iPhone 上的限免游戏。
看来还是代码的问题
赞!用静态化插件的路过,一天SQL查询没几次
个人博客用静态化不错,但是如果登陆用户很多的博客,或者使用 WP 构建的动态网站,静态化就比较麻烦。
也对,收藏一下此文
MySQL 设置 MySQL Query Cache具体怎么设置在哪个文件设置啊?搜索到的都是再说理论性的
好像是这样。
我的页面www.ons128.net.载入页面的时间:0.584/载入页面查询: 40
看denis你的网站优化真好,好羡慕啊
denis,你评论这的赞,举报怎么实现的
多说!
谢谢