很多同学都说 WordPress 很慢,但是作为全世界最常用的建站和博客系统 WordPress 来说,我相信在性能设计上肯定不会有太大的问题,WordPress 开发团队也肯定也考虑到这个问题。其实我觉得,WordPress 并不慢,只是看你会不会用,就像 Windows、Android,有些人觉得不错,有些人觉得慢、差劲,其实也许是你会不会使用的问题。
主机自身的速度的确是影响网站速度最重要的一点,但除此之外,还受到其他很多方面的影响,比如安装太多效率低下的插件,使用代码质量低下的主题,没有正确使用 WordPress 的缓存等。
今天我就结合实例(本博客)来和大家分析一下这个问题。
首先说下,本博客托管在一般的虚拟主机上,并没有托管在 VPS、有 Memcached 等各种各样内存缓存的虚拟主机上,而且,本博客也没有用任何静态化缓存插件,因为我给博客配置了“手机版”,用这些插件特别容易出问题。
那么怎么去优化自身呢?
尽量减少使用插件
这是首要的一点。有句流行的话说过“能用代码解决的决不用插件”,但实际情况是大部分的人往往都没足够的代码知识,更不可能做到每个插件的代码化。所以,更好的选择是能不用的插件就不用。因为大部分的插件都会进行数据查询与生成,这在页面生成过程中将耗费时间。需要注意的是,尽量不要使用效率极低的插件,比如某些 SEO 插件,这完全是可以用代码实现的,对于某些插件仅有一个文件的,完全可以尝试自己简单修改、阅读,加入主题的 Functions.php 中,我相信对大部分喜欢折腾 WordPress 的人来说,没什么难度。
并且,插件大多都会在页面中载入各种各样的 CSS 和 JS,而网站优化中有2条内容是:
- 减少HTTP请求,每一次对于JS,CSS等文件的访问都是一次HTTP请求。插件用得少,HTTP 请求数自然就变少了。
- 合并 CSS 和 JS 文件,减少HTTP请求的首要办法是合并 CSS 和 JS。因为浏览器没有你们想象中的那么聪明,告诉一个令你们感到不可思议的事实——1个 10KB 的 JS 和2个 5KB 的 JS 载入所耗费的时间是不一样的,而且后者载入时间会明显增多。特别是文件都在同一域名下这样的情况更为明显。而插件的 JS 和 CSS 都是独立的,如果10个插件每个都生成1个 JS + 1个CSS,再加上主题的话,CSS 和 JS 的数量的数量可能会令你无法想象。当然,我也用了好多插件(20来个~),你要是有点水平的话,可以尝试自己合并,但是,我想说的是,个人建议不要使用自动合并插件,很多时候,出了问题,你也不知道该怎么办,甚至出了问题你还没有知道。
而且,对于不用插件的处理,我建议“删除”而不是简简单单的“禁用”。因为 WordPress 在每一次的页面访问时,都会判断插件的使用情况。让 WordPress 做更少的判断就等于做更少的数据查询。
使用经过优化的主题
如今 WordPress 主题是越来越绚丽,但请你们在使用这些主题时,考虑下主机能否带得动。而且,明显那些国外的主题(默认主题除外)不太适合我们,因为一些国外的主题往往使用了过多的 JS 和 CSS,人家带宽好,不怕这些,但我们 4M、6M 甚至有些地方还在用着 1M、2M 的宽带的人使用起来可就受苦了。当然,如果你会手动修改主题,使其能适应我们这种带宽的话,我没意见。
使用的主题尽量满足以下要求:
- 合并 CSS 和 JS——尽量仅仅使用一个 JS 和一个 CSS
- 正确放置 CSS 和 JS 的位置——尽量将 JS 放置到页面底部、CSS 放置到页面顶部(最好放在</head>之前)
- 合并图片——尽量少使用图片,能的话,将主题图片使用 CSS Sprites 控制在1~2个
- 减少数据查询——尽量少使用数据查询,能直接输出的就不要用数据查询
对页面进行 GZip 压缩
使用 GZip 压缩至少可以减少网页体积20%(静态资源除外)。通常大部分的优秀主机都能够支持服务端的 GZip 并且可以自动压缩。如果服务器没有自动进行页面压缩,就需要自行开启。如何开启,我就不多说了,这个请自己百度,寻找适合的方法。
使用 CDN 加速静态资源
网站的静态文件一般有两种:第一种是网站的 CSS,JS 和一些主题的常用背景图片和按钮文件,这些图片如果网站不进行改版或者其他改动,基本上是不会修改的,第二种是每天更新的网站内容中上传的图片或者附件,这些图片文件也是基本不会改动的。
解决好静态文件存储和加速,网站性能就首先能得到基本的保证了,WordPress 构建的网站和博客也是一样的。对于这些静态文件来说,最好的解决方案永远是使用 CDN 网络进行加速,这样服务器的压力将大大降低,因为访问页面只有当前页面是在自己服务器上,其他所有图片 JS CSS 都是从 CDN 获取的。
从使用便捷性和性价比角度来说,个人推荐七牛云存储。
正确使用缓存插件
这个要跟据你的实际情况使用,比如本博客使用的是 WP File Cache + DB Cache Reloaded Fix,考虑到 WP File Cache,网上还没有教程,有时间我再写一个吧!
有效利用 WordPress 自身缓存机制——对象缓存
要彻底明白和搞懂 WordPress 性能优化,首先要理解 WordPress 缓存机制,WordPress 默认是一种叫做 WordPress Object Cache 的对象缓存机制,它把需要缓存的内容按照 Key-Value 这样的模式进行缓存(和 No-SQL 的 key-value 的有点类似),当然它还支持按照 Group 来划分和避免缓存的内容冲突。
所以最基础的 WordPress 缓存就是,把 WordPress 产生的 Key-Value 缓存起来。比如存到文件(文件缓存),或者存到内存(内存缓存)。
由此得知,WordPress 主题和插件尽量使用模板函数,因为 WordPress 模板函数如果部分已经做好了 WordPress Object Cache。
比如 get_the_terms 和 wp_get_object_terms 这两个函数,功能基本一样,但是 get_the_terms 直接从对象缓存中取数据,无查询,而 wp_get_object_terms 每次都从数据库中取数据。
WordPress 插件和主题如果一定要直接查询数据库,请做好 WordPress Object Cache,将查询的结果使用 wp_cahce_set 存到 Object Cache 中,下次直接使用 wp_cache_get 获取。
不过,需要注意的是,别过度,比如某些已经使用过 WordPress Object Cache 的模版函数,就不要自作多情再增加一个了,那样会更慢。
用好 WordPress Transients API
Transients 是瞬时的意思,WordPress 的 Transients API 就是 WordPress 用来存储一些缓存的数据到数据库中最简单也是最标准的方法,Transients API 给这些缓存的数据一个过期时间,并且时间已到就会自动删除,所以如果你需要存储一些有生命周期的选项的时候,Transients API 就是最好的选择。
这难道同样不是我们做缓存的最佳选择么?
尽量不使用 WordPress 小工具
WordPress 小工具其实是速度变慢的根源之一,因为这会引发许许多多的数据查询。所以,尝试自己手写 SideBar 吧,这并不难。而且,这样也有利于我们使用 WordPress Transients API 和 WordPress Object Cache。