插件WP Super Cache

相关配置见:WordPress 加速系列(1):WP Super Cache 缓存静态网页 – Eterance的小窝

Memcached简介

memcached为缓存的一种(类似Redis),从内存中获取数据,减少服务器向数据库发送的查询请求次数。

安装

如果使用宝塔面板,安装过程可参考:
WordPress 加速系列(2):memcached 加速数据库查询 – Eterance的小窝

使用CentOS7安装流程如下,其他内核可自行修改相应的命令

Remi&PECL安装方式缺陷

memcached工作时需要依赖php扩展Igbinary,用于数据的序列化和反序列化,且ig使用紧凑的二进制格式存储数据,显著减少序列化数据的大小和内存占用,特别适合需要频繁序列化的场景,如memcached等内存存储系统。工作流程:

PHP应用 → memcached扩展 → [检查序列化器] → igbinary扩展
                 └─→ 需要编译时链接支持

memcached添加扩展需要在编译时(即安装时)进行静态链接才能正常运行。而REMI RPM安装时仅进行动态链接,直接安装memcached和igbinary后memcached并不能与igbinary进行交互,报错:undefined symbol: igbinary_serialize(成功链接后memcached会新增该选项,用于配置是否启用igbinary)。

使用PECL编译安装时采用静态链接,理论上可以正常安装,但在测试部分一直因为未知原因无法通过,故不采用。(可能是CentOS7版本太旧导致的bug)

手动编译安装

若先使用了前两种安装方法不成功,在手动编译前应该确保删除之前安装的包,并清理配置文件和PECL缓存和注册表,在确认PHP环境无污染后再进行后续操作,避免出现不必要的问题。
关于清理PECL注册表,如果清理不干净,建议直接卸载PECL重装。

卸载PECL并重装流程如下,PHP版本为8.2.20,其他版本的对应信息自行查阅
(以下内容来自qwen.ai):

卸载PECL/PEAR系统

1. 卸载PHP PEAR/PECL核心包

# 停止PHP服务
sudo systemctl stop php-fpm 2>/dev/null
sudo systemctl stop httpd 2>/dev/null

# 卸载PHP扩展
sudo yum remove -y \
  php-pecl-memcached \
  php-pecl-igbinary \
  php-pecl-memcache \
  php-opcache \
  php-devel

# 彻底清除PECL系统
sudo yum remove -y php-pear
sudo rm -rf \
  /usr/share/php/.registry \
  /var/cache/pear \
  /etc/pear.conf \
  /usr/local/etc/pear.conf \
  /usr/lib/php/pear \
  /usr/share/php/PEAR \
  /usr/local/lib/php

2. 清除所有扩展文件(关键步骤)

# 删除模块文件
sudo rm -fv /usr/lib64/php/modules/{memcached,igbinary,opcache}.so

# 删除配置文件
sudo rm -fv /etc/php.d/*{memcached,igbinary,opcache}*

# 清理PHP配置
sudo sed -i '/memcached/d; /igbinary/d; /opcache/d' /etc/php.ini

3. 验证是否已完全移除

# 验证清理结果
php -v 2>&1 | grep -v "PHP Warning"  # 应无模块加载警告
ls -l /usr/lib64/php/modules/ | grep -E 'memcached|igbinary'  # 应无输出

重建PECL环境

1. 重装PECL

# 重新安装PHP PEAR/PECL
sudo yum install -y php-pear

# 重置PECL配置
sudo pear config-set auto_discover 1
sudo pear config-set preferred_state stable
sudo pear config-set preferred_mirror pear.php.net
sudo pear config-set php_dir /usr/share/pear
sudo pear config-set cfg_dir /etc/php-cli

# 验证PECL安装
pecl version
# 应输出: PECL version 1.x.x

2. 安装编译依赖

# 安装必要开发工具
sudo yum groupinstall -y "Development Tools"
sudo yum install -y \
  php-devel \
  libmemcached-devel \
  zlib-devel \
  bzip2

# 验证PHP开发环境
phpize -v | grep "PHP Api Version"
# 应输出: PHP Api Version: 20220829 (匹配PHP 8.2.20)

手动编译igbinary

1. 下载并编译Igbinary

# 创建构建目录
# 安装路径可自行替换
mkdir -p /app/pecl-build && cd /app/pecl-build

# 下载源码
# 对于PHP8.2.20,igbinary版本应大于等于3.2.0
wget https://pecl.php.net/get/igbinary-3.2.0.tgz
tar -xzf igbinary-3.2.0.tgz
cd igbinary-3.2.0

# 手动编译安装
phpize
./configure
make -j$(nproc)
sudo make install

# 验证头文件安装(关键!)
# 安装memcached时需要链接此头文件,务必确保该文件路径已知
sudo mkdir -p /usr/include/php/ext/igbinary
sudo cp igbinary.h /usr/include/php/ext/igbinary/
ls -l /usr/include/php/ext/igbinary/igbinary.h
# 应输出: -rw-r--r-- 1 root root ... /usr/include/php/ext/igbinary/igbinary.h

2. 配置Igbinary

# 创建配置文件
echo "extension=igbinary.so" | sudo tee /etc/php.d/20-igbinary.ini

# 验证安装
php -m | grep igbinary  # 应输出: igbinary
php -r "var_dump(function_exists('igbinary_serialize'));"  # 应输出: bool(true)

手动编译安装memcached

1. 下载并编译memcached

# 返回构建目录
cd ../

# 下载源码
# 对于PHP8.2.20,igbinary版本应大于等于3.3.0
wget https://pecl.php.net/get/memcached-3.3.0.tgz
tar -xzf memcached-3.3.0.tgz
cd memcached-3.3.0

# 手动编译安装(关键配置)
phpize
./configure \
  --with-libmemcached-dir=/usr \
  --enable-memcached-igbinary \
  --disable-memcached-sasl
make -j$(nproc)
sudo make install

2. 创建配置文件

# 创建配置文件
echo "extension=memcached.so" | sudo tee /etc/php.d/30-memcached.ini
echo "memcached.serializer=igbinary" | sudo tee -a /etc/php.d/30-memcached.ini

# 重启服务
sudo systemctl restart httpd 2>/dev/null || sudo systemctl restart php-fpm

3. 验证编译结果

# 1. 检查configure日志
grep "igbinary" config.log
# 必须包含:
#   checking for igbinary support... yes
#   checking for igbinary_serialize... yes
# 对于不同版本的memcached此部分日志可能稍有不同,可以自行打开编译目录中的config.log,查找igbinary以检验。
# 如memcached-3.3.0,此部分日志如下:
# configure:4030: checking whether to enable memcached igbinary serializer support
# configure:4044: result: yes
# configure:4612: checking for memcached igbinary support
# configure:4615: result: enabled

# 2. 检查符号链接
nm -D /usr/lib64/php/modules/memcached.so | grep igbinary_serialize
# 必须输出: U igbinary_serialize

# 3. 检查memcached支持
php -i | grep -A 10 "memcached support"
# 必须包含:
#   igbinary support => enabled
#   json support => enabled

检验安装

可以创建脚本一次性检验memcached安装是否成功:

#!/bin/bash
set -e

echo "===== 1. 配置文件顺序验证 ====="
echo "配置文件顺序:"
ls -l /etc/php.d/*{igbinary,memcached}* 2>/dev/null || echo "无配置文件"

echo -e "\n===== 2. 扩展加载状态 ====="
php -m | grep -E 'igbinary|memcached' || echo "扩展未加载"

echo -e "\n===== 3. 符号解析验证 ====="
echo "memcached符号:"
nm -D /usr/lib64/php/modules/memcached.so 2>/dev/null | grep igbinary_serialize || echo "符号未找到"

echo -e "\nigbinary符号:"
nm -D /usr/lib64/php/modules/igbinary.so 2>/dev/null | grep igbinary_serialize || echo "符号未找到"

echo -e "\n===== 4. memcached支持信息 ====="
php -i | grep -A 5 "memcached support" 2>/dev/null || echo "memcached支持信息缺失"

echo -e "\n===== 5. 序列化器功能验证 ====="
php -r '
try {
    $m = new Memcached();
    $serializers = $m->getSerializers();
    echo "可用序列化器: " . implode(", ", $serializers) . "\n";
    
    if (in_array("igbinary", $serializers)) {
        $m->setOption(Memcached::OPT_SERIALIZER, Memcached::SERIALIZER_IGBINARY);
        $m->set("test", ["data" => "value"]);
        $result = $m->get("test");
        echo "igbinary序列化测试: " . (is_array($result) ? "成功" : "失败") . "\n";
    } else {
        echo "ERROR: igbinary不在序列化器列表中!\n";
    }
} catch (Error $e) {
    echo "FATAL ERROR: " . $e->getMessage() . "\n";
}
'

对于上述脚本,若在序列化器验证步骤中出现”FATAL ERROR: Call to undefined method“,请输入命令

php -i | grep -A 10 "memcached support
# 若出现json support => no

则需要安装php的json扩展(memcached-3.3.0需要json扩展才能开启getSerializers()方法,与一般用Redis存储JSON字符串类似)

# 安装PHP JSON扩展(memcached 3.3.0必需)
sudo yum install -y php-json

# 验证安装
php -m | grep json
# 应输出: json

并重新编译:

# 返回构建目录
cd /app/pecl-build/memcached-3.3.0

# 清理旧编译
make clean

# 重新配置(关键:启用所有序列化器支持)
phpize
./configure \
  --with-libmemcached-dir=/usr \
  --with-php-config=$(which php-config) \
  --enable-memcached-igbinary \
  --enable-memcached-json \
  --disable-memcached-sasl

# 验证configure结果
grep -E "igbinary|json support" config.log
# 必须包含:
#   checking for igbinary support... yes
#   checking for json support... yes

# 编译安装
make -j$(nproc)
sudo make install

# 验证memcached支持
php -i | grep -A 10 "memcached support"
# 必须包含:
#   json support => enabled
#   igbinary support => enabled

# 验证方法存在
php -r "var_dump(method_exists('Memcached', 'getSerializers'));"

此外,仍需使用info.php文件检验JSON扩展的状态,只有当页面中也显示YES时才算成功配置(命令行与WEB的环境可能不同)

# info.php
<?php phpinfo(); ?>

二编

由于未知因素的影响,检验安装部分中命令

php -r "var_dump(method_exists('Memcached', 'getSerializers'));"

可能会输出"bool(false)",经测试不影响使用,只要info.php中显示memcached已经支持igbinary和json即可。

明明在安装时还是true,写博客就出问题了...

OPcache简介

除了Memcached之外,OPcache能够加速php文件执行,大幅提升页面加载速度。

对于命令行,可以直接使用以下命令安装,由于CentOS 7默认仓库不包含PHP 8.2,于是使用REMI仓库源:

sudo yum install --enablerepo=remi-php82 php-opcache

安装完成后,检查OPcache是否已正确安装:

php -m | grep opcache

编辑OPcache配置文件:

sudo vim /etc/php.d/10-opcache.ini

对于配置的详细信息,见Eteramce的博客:
WordPress 加速系列(3):OPCache 加速 PHP 的执行

CDN配置

首先需要获取一个加速域名,可以从阿里云获取。获取加速域名后,需要为其配置CNAME的DNS解析。

在验证完成后,可以在缓存配置页面增加WordPress的图片路径,为所有图片创建CDN缓存。(默认为/wp-content/uploads)

还可以配合WP Super Cache对其缓存的静态页面配置CDN加速,如图:

在CNAME记录处填上之前配置CNAME时相同的值即可,另外不要再”包括目录“中填入重复的路径,如"wp-content","wp-content/uploads",会导致缓存的静态文件不可访问。

另外,若配置CDN后出现页面无法加载,且F12控制台出现类似于

(index):1 Access to font at 'http://blog.fflamingo.top/xxx/xxx' from origin 'http://fflamingo.top' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.,

的跨域问题,可以在Apache配置文件添加如下内容:

<LocationMatch "^(/wp-content/uploads|/wp-content|/wp-includes)">
    Header always set Access-Control-Allow-Origin "http://fflamingo.top"
    Header always set Access-Control-Allow-Methods "GET, OPTIONS"
    Header always set Access-Control-Allow-Headers "Origin, Authorization, Accept"
    Header always set Access-Control-Allow-Credentials "true"
</LocationMatch>

Nginx:

server {
    # 其他server块配置...

    # 匹配 /wp-content/uploads、/wp-content、/wp-includes 路径
    location ~ ^/(wp-content/uploads|wp-content|wp-includes) {
        # 设置CORS响应头
        add_header 'Access-Control-Allow-Origin' 'http://fflamingo.top' always;
        add_header 'Access-Control-Allow-Methods' 'GET, OPTIONS' always;
        add_header 'Access-Control-Allow-Headers' 'Origin, Authorization, Accept' always;
        add_header 'Access-Control-Allow-Credentials' 'true' always;

        # 处理OPTIONS预检请求
        if ($request_method = 'OPTIONS') {
            # 对于OPTIONS请求,直接返回204 No Content
            return 204;
        }

        # 这里继续你的其他配置,例如root、proxy_pass等
        # root /your/web/root;
        # try_files $uri $uri/ /index.php?$args; # 适用于WordPress的常见配置
    }

    # 其他location块配置...
}

修改完成后重启Web服务即可。




封面图: 雨一直下

我想活得聪明,通透,快乐,满足。 我想我的世界窗明几净。 一片雾蓝色。
最后更新于 2025-09-03