WordPress启用Memcached内存缓存和Page Cache页面缓存

提高WordPress站点的访问速度,最快最方便的方法就是使用缓存,而网站使用最多的就是内存缓存Memory Cache和页面缓存Page Cache;

Memory Cache和Page Cache的区别

Memory Cache内存缓存存储在RAM上,这样写和访问速度更快,但在电脑关机或某些其他情况下会被清除。磁盘缓存写入硬盘,读写较慢,但会留在磁盘上。在VPS服务器上启用memory cache目的是为了将数据库的动态内容缓存起来,这样不用每次得到相同请求时都要去查询搜索数据库存,更加节省资源和时间。Memory Cache有很多种,如APCu,Redis,相对于小型VPS来讲Memcached是最为合适的。

Page Cache页面缓存用于加速对磁盘上图像和数据的访问。它用于一次一页地缓存文件的逻辑内容,并通过文件和文件内的偏移量来访问。当页面从磁盘读入内存时,它们被缓存在页面缓存中。所以在VPS启用page cache就能更快读取内容,而不用每次得到请求要向磁盘搜索内容再输出。

区分内存缓存memcached和memcache

简单从两方面来讲

服务端Memcached(Memcache Daemon): 是根据修订后的BSD许可证许可的免费开源、高性能、分布式内存对象缓存系统,也是Memcached是以守护进程形式,长驻内存当中的高性能分布式的key-value缓存系统,本质上是通用的,但旨在通过减轻数据库负载来加速动态web应用程序。它通常用于通过在服务器内存中缓存数据和对象来加速动态数据库驱动的网站,以减少必须读取数据源的次数。Memcached基于 libmemcached库开发并包含一些附加特性,所以功能丰富。可下载地址:https://memcached.org/

客户端分为php-memcache和php-memcached: 两者都是PHP的扩展,主要区别是:

php-memcache 是一个原生版本,完全是在 PHP 框架内开发的,支持 OO(面向对象) 和非 OO 两套接口并存,php-memcache可以独立使用,也可以是PHP连接memcached服务端的扩展,这个扩展允许您通过方便的面向对象和过程接口使用memcached。该扩展允许使用通过memcache在memcached中存储会话。下载地址:https://pecl.php.net/package/memcache;

php-memcached 是PECL memcached扩展,使用libmemcached库连接到memcached服务器,只支持 OO 接口。这就意味着在安装 php-memcache 扩展的时候不要求安装其他的东西,但是在安装 php-memcached 的时候会要求你安装 libmemcached。这个扩展使用libmemcached库来提供与memcached服务器通信的API。下载地址:https://pecl.php.net/package/memcached

安装服务端Memcached

官网:https://memcached.org

下载 wget https://memcached.org/files/memcached-1.6.22.tar.gz

	• tar -xvf memcached-1.6.22.tar.gz
	• cd memcached-1.6.22
	• ./configure --prefix=/usr/local/memcached
	• make && make install
	• ln -sf /usr/local/memcached/bin/memcached /usr/bin/memcached

验证安装:memcached -h
结果会显示版本号和相关命令:memcached 1.6.22

将已经编辑好的memcached启动文件上传到/etc/init.d/,再执行以下命令【memcached放在本文最后】

chmod +x /etc/init.d/memcached
useradd -s /sbin/nologin nobody

控制命令 /etc/init.d/memcached {start|stop|status|restart|reload}
设置为自启动 update-rc.d memcached defaults

安装客户端PHP扩展php-memcache

这个扩展允许您通过方便的面向对象和过程接口使用memcached。
该扩展允许使用通过memcache在memcached中存储会话。

下载 wget https://pecl.php.net/get/memcache-8.2.tgz

	• tar -xvzf memcache-8.2.tgz
	• cd memcache-8.2
	• /usr/local/php/bin/phpize
	• ./configure --with-php-config=/usr/local/php/bin/php-config
	• make & make install

检查:Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-zts-20220829/下是否生成memcache.so

  • 激活:/usr/local/php/etc/php.ini 找到Dynamic Extensions 添加 extension=memcache.so
  • 为了不损坏php.ini,推荐使用以下方法添加memcache.so
    cat >/usr/local/php/conf.d/004-memcache.ini<<EOF
    extension = memcache.so
    EOF

    004代表优先处理优先级,较小的值会在较大的值之前加载文件。memcached加载值是005
    conf.d的文件默认覆盖php.ini下的同一命令或参数
    重启PHP:lnmp restart
    在prober.php中检查是否生效

安装客户端PHP扩展php-memcached

这个扩展使用libmemcached库来提供与memcached服务器通信的API。

优先安装libmemcached,php-memcached扩展,就是PECL memcached扩展,必须使用libmemcached库连接到memcached服务器。

(libMemcached是用于Memcached服务器的开源C/C++客户端库和工具(http://danga.com/memcached)。它被设计成内存使用量小、线程安全,并提供对服务器端方法的完全访问。)

	• wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz
	• tar -xvf libmemcached-1.0.18.tar.gz
	• cd libmemcached-1.0.18
	• ./configure --prefix=/usr/local/libmemcached --with-memcached
make && make install

安装php-memcached扩展

	• wget https://pecl.php.net/get/memcached-3.2.0.tgz
	•  tar -xvzf memcached-3.2.0.tgz
	• cd memcached-3.2.0
	• 找到phpize的位置:/usr/local/php/bin/phpize
	• ./configure --with-php-config=/usr/local/php/bin/php-config --enable-memcached --with-libmemcached-dir=/usr/local/libmemcached/
	• make && make install
	• 添加memcached.so
    cat >/usr/local/php/conf.d/005-memcached.ini<<EOF
extension = memcached.so
EOF

检测Memcached内存缓存

在PHP memcache和Memcached安装完成以后,最好是再通过prober.php类似的程序检查一下代码是否安装成功。如安装成功使用以下命令检测memcached

telnet 127.0.0.1 11211 得到结果: Escape character is '^]'.
命令:stats, 得到各参数状态
命令:stats items, 检查项目状态
命令:stats slabs, 检查内存状态
或:ss -tunl | grep 11211

端口11211是Memcached默认的,如果以下检测结果正常,则表示Memcached内存缓存启动成功

如何让WordPress启用Memcached内存缓存

WordPress使用Memcached内存缓存需要用到一个后端对象缓存程序Memcached Object Cache,可以在WordPress插件页直接下载https://wordpress.org/plugins/memcached/,或https://github.com/Automattic/wp-memcached,此插件是不能直接安装的,需要装下载下来的object-cache.php文件手工放置到wp-content目录下,WordPress将会自动识别此缓存文件;

到目前,Memcached已经在WordPress启用成功了。如果默认本地服务器不是127.0.0.1,需要在wp-config.php中指定默认

$memcached_servers = array(
    'default' => array(
        '127.0.0.1:11211',
        '10.10.10.20:11211',
        '10.10.10.30:11211'
    )
);

但是如果一个VPS下有多个网站需要使用Memcached,而Memcached是共用池,多个 WordPress 网站的表前缀都相同wp_或是不同的,那么 object-cache.php 就无法区分是哪个站点了。我们需要告诉Memcached如何去区分保存缓存数据,以便不同网站能识别;

Memcached Object Cache最大的方便就是不需要去改表前缀了,只需要在wp-config.php指定一下key就行。

define( 'WP_CACHE', true );
define( 'WP_CACHE_KEY_SALT', 'colinqi.com');

如果需要视图效果查看点击率等数据,可以下载一个页面程序通过网页直接查看;由kn007提供的memcached.php则是为您的memcached服务器提供一个类似APC的stats/info页面。(unix套接字支持),下载地址:https://github.com/kn007/memcache.php

 

Memcache Cache Info
Memcache Cache Info

如何启用页面缓存Page Cache

使用Page Cache的WordPress的插件是非常多的,也有使用手工代码的,但不如插件方便;这里推荐一个单纯的Page Cache页面缓存插件,功能单一,不像很多SEO插件集成了很多用不到的功能,而且还是免费的。插件名称:Cache Enabler, 此插件还有一个不错的进阶功能就是可以集成KeyCDN, 主要特点如下:

  • 快速高效的缓存引擎
  • 自动智能缓存清除
  • 手动缓存清除
  • WP-CLI缓存清除
  • 缓存过期
  • WebP支持(使用Optimus将图像转换为WebP)
  • 支持移动平台
  • Brotli和Gzip预压缩支持
  • HTML的缩小,包括或不包括内联CSS和JavaScript
  • WordPress仪表盘中的实时缓存大小显示
  • 自定义帖子类型支持
  • 304未修改支持
  • 与插件Autoptimize完美配合

memcached启动文件,位置/etc/init.d/memcached

#! /bin/bash
#
# memcached:    MemCached Daemon   
#
# chkconfig:    - 90 25  
# description:  MemCached Daemon   
#
### BEGIN INIT INFO
# Provides:          memcached
# Required-Start:    $syslog
# Required-Stop:     $syslog
# Should-Start:        $local_fs
# Should-Stop:        $local_fs
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description:    memcached - Memory caching daemon
# Description:        memcached - Memory caching daemon
### END INIT INFO

IP=127.0.0.1
PORT=11211
USER=root
MAXCONN=1024
CACHESIZE=64
OPTIONS=""

RETVAL=0
prog="memcached"

start() {
    echo -n "Starting $prog: "
    /usr/local/memcached/bin/memcached -d -l $IP -p $PORT -u $USER -m $CACHESIZE -c $MAXCONN -P /var/run/memcached.pid $OPTIONS
    if [ "$?" != 0 ] ; then
        echo " failed"
        exit 1
    else
        touch /var/lock/subsys/memcached
        echo " done"
    fi
}
stop() {
    echo -n "Stopping $prog: "
    if [ ! -f "/var/run/$prog.pid" ]; then
        echo "$prog is not running."
        exit 1
    fi
    kill `cat /var/run/memcached.pid`
    if [ "$?" != 0 ] ; then
        echo " failed"
        exit 1
    else
        rm -f /var/lock/subsys/memcached
        rm -f /var/run/memcached.pid
        echo " done"
    fi
}

restart() {
    $0 stop
    sleep 2
    $0 start
}

status() {
    if [ -f "/var/run/$prog.pid" ]; then
        echo "$prog is running."
    else
        echo "$prog is stopped."
    fi
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    restart|reload)
        restart
        ;;
    status)
        status
        ;;
    *)
        echo "Usage: $0 {start|stop|status|restart|reload}"
        exit 1
        ;;
esac

exit $?

The End.

Previous/Next

Say Something!

Leave a Reply