自从将网站从Hexo迁移到Wordpress之后,我发现虽然在后台操作以及功能添加方面Wordpress明显方便快捷,更胜一筹,但是从网页加载速度的角度,PHP动态网站比起HTML静态网页的加载速度还是要逊色一点的。
关于Hexo静态网站,这里推荐一个极简优化的范例:“马攀的技术栈”,该网站性能优化到令我叹为观止,我在澳大利亚加载该网站的速度经常是秒开,通过WebPagaTest工具实测加载速度仅为2s,这个速度可以说是非常惊艳了。有兴趣的同学可以戳https://mapan.tech/cn/进行访问。

动态网站优化
关于Wordpress动态网站的优化,主要从以下几个角度:
- 静态文件优化(CDN加速)
- 服务器开启动态缓存(memcached,PHP-OPCache,MySQL Query Cache)
静态文件加速主要是提高图片,JS以及CSS文件等静态文件的加载速度。关于CDN加速,有机会了专门写一篇文章来讲一讲,这是个好东西。
配置动态缓存加速也相当重要。Wordpress使用PHP语言,通过PHP语言调用MySQL数据库来完成数据的读取以及网页的渲染。每当用户访问网站时,网站便会调用PHP程序进行网页加载。轻量级的访问通常不会对速度产生太大的影响,但大量的服务器访问会导致网站加载速度变慢,服务延时。所以此时如果将PHP以及MySQL数据库文件保存在内存中缓存起来,随时等待用户访问调用,此时的网站加载度会大幅提高,毕竟内存的读取速度是要远高于硬盘的。
那么这个时候就需要一个工具来替我们完成这个工作。我使用的Memcached 是一种高性能的分布式内存对象缓存系统,在动态程序中使用 Memcached,既能提高访问的速度,同时还减低了数据库的负载。
PHP有memcache和memcached两个类似组件,前者(不带d)出现较早,是 pecl 扩展库版本,原生支持PHP,而后者(带d)是libmemcached 版本,算是新一代,因此功能也更加完善,推荐使用。有兴趣的同学也可以了解一下Redis,功能类似,可以尝试。
部署及配置memcached
下面来讲一下如何在Linux服务器上部署memcached动态缓存加速。
Linux系统安装memcached,首先要先安装libevent库,随后安装memcached,最后安装PHP memcached 扩展包。
#Ubuntu/Debian 自动下载安装
sudo apt-get install libevent ibevent-dev
sudo apt-get install memcached
sudo apt-get install php-memcached
#Redhat/Fedora/Centos 自动下载安装
yum install libevent libevent-devel
yum install memcached
yum install php-memcached
安装完成后,开启服务。
#启动memcached
service memcached start
#开机启动memcached
chkconfig memcached on
检验PHP memcached模块是否加载成功:
php -m | grep memcached
命令行输出:memcached,表明模块加载成功。如未输出内容,表明模块尚未被识别,需要寻找到php.ini文件,添加注释。
find / -name php.ini
上述命令会返回php.ini的路径,根据路径找到php.ini并添加如下代码:
extension=memcached.so
再次检验PHP memcached模块是否加载成功,此时笔者的服务器警告:
[root@VM_10_208_centos ~]# php -m | grep memcached
PHP Warning: PHP Startup: Unable to load dynamic library 'memcached.so' (tried: /usr/lib64/php/modules/memcached.so (/usr/lib64/php/modules/memcached.so: undefined symbol: php_json_decode_ex),
/usr/lib64/php/modules/memcached.so.so (/usr/lib64/php/modules/memcached.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
memcached
这个错误很奇怪,明明返回了memcached模块,却被警告无法正确加载动态数据库。此时根据Google网友的建议,我将上述php.ini中的注释删去,找到php.d文件夹,在其中新建一个memcached.ini新文件,文件中写入:
; Enable memcached extension module
extension=memcached.so
此时该模块已经可以被正常识别。测试以下缓存:
<?php
$m = new Memcached();
$m->addServer( '127.0.0.1', 11211 );
$m->set( 'foo', 100 );
echo $m->get( 'foo' ) . "\n";
将如下代码保存为test.php文件,然后执行 php -f test.php,如果能输出100表示安装成功。
WordPress中配置memcached
关于Wordpress配置memcached,网上有很多介绍,关键就在于一个PHP脚本object-cache.php,将这个脚本复制在wp-content目录下便可开启memcached。理想很丰满,现实确是,在部署过程中会遇到很多的bug,所以笔者再此提醒各位博主,耐心一点,有问题可以及时搜索或提问。
以下是一些推荐的脚本资源:
https://github.com/tollmanz/wordpress-pecl-memcached-object-cache
https://www.zkii.net/download/software/WP_Cache.zip
如何查看缓存命中情况,这时候需要另一个脚本:
http://pecl.php.net/get/memcache-3.0.8.tgz
下载解压后找到memcache.php文件,将其上到wordpress根目录下。再上传之前,需对其参数进行调整:
define('ADMIN_USERNAME','memcache'); // Admin Username 登录名称,自行修改
define('ADMIN_PASSWORD','password'); // Admin Password 登录密码,自行修改
define('DATE_FORMAT','Y/m/d H:i:s');
define('GRAPH_SIZE',200);
define('MAX_ITEM_DUMP',50);
//下面是定义memcached服务器,一般我们是单机部署,所以注释掉一行,并将服务器地址根据实际修改,比如本文是127.0.0.1
$MEMCACHE_SERVERS[] = '127.0.0.1:11211'; // add more as an array
//$MEMCACHE_SERVERS[] = 'mymemcache-server2:11211'; // add more as an array
上传后访问你的网站www.yourwebsite.com/memcache.php即可访问后台,查看缓存使用及命中情况:

到此为止整个Memcached的配置就应该完成了,后续可以优化一下脚本,提高缓存命中率。