Redis 与 OPcache 性能优化
梳理子比主题站点的 Redis 服务、PHP Redis 扩展、WordPress 对象缓存、OPcache、页面缓存和 CDN 加速边界。
Redis 和 OPcache 解决的是两类不同的性能问题:Redis 常用于 WordPress 对象缓存,减少数据库重复查询;OPcache 缓存 PHP 编译结果,减少 PHP 文件每次请求时的解析成本。它们不是 CDN,也不是页面缓存插件,不能替代伪静态、图片优化、数据库索引和前端资源治理。
子比主题功能覆盖用户中心、商城、论坛、支付、消息、投稿和动态模块。加速时要先区分“可以缓存的静态内容”和“必须实时计算的用户数据”。把所有页面一股脑缓存起来,往往比不开缓存更危险。
四层加速
| 层级 | 作用 | 典型组件 |
|---|---|---|
| PHP 字节码缓存 | 减少 PHP 文件解析和编译成本 | OPcache |
| 对象缓存 | 缓存 WordPress option、transient、查询结果和主题对象缓存 | Redis |
| 页面缓存 | 缓存游客 HTML 页面 | 缓存插件、Nginx fastcgi_cache、OpenLiteSpeed Cache |
| 静态资源缓存 | 缓存图片、CSS、JS、字体 | CDN、浏览器缓存 |
建议按这个顺序启用:先确认基础环境和扩展,再启用 OPcache,再启用 Redis 对象缓存,最后才配置页面缓存和 CDN。每加一层都要重新测试登录、用户中心、支付、验证码、评论和移动端操作。
部署队列检测
本站在线部署队列已经把 Redis 和 OPcache 作为独立组件检测。检测逻辑会读取:
| 检测项 | 命令或方式 |
|---|---|
| PHP 版本 | php -r 'echo PHP_VERSION;' |
| OPcache | phpversion("Zend OPcache") 或 phpversion("opcache") |
| PHP Redis 扩展 | phpversion("redis") |
| Redis 服务 | redis-server --version |
这也是手动排查时的基本思路:Redis 服务存在,不代表 PHP 能连接 Redis;PHP Redis 扩展存在,也不代表 WordPress 已启用对象缓存插件。
三个 Redis 概念
| 名称 | 说明 |
|---|---|
| Redis 服务 | 服务器上的 redis-server,负责存储缓存数据 |
| PHP Redis 扩展 | PHP 连接 Redis 的扩展,WordPress 插件需要它 |
| WordPress 对象缓存 | 通过插件或 drop-in 把 WordPress 缓存写入 Redis |
这三者缺一不可。只装 Redis 服务,WordPress 不会自动使用;只装 PHP Redis 扩展,但没有对象缓存插件,也不会把 WordPress 查询结果写入 Redis。
Docker 部署里,队列会写入:
define('WP_REDIS_HOST', 'redis');这是因为 Docker Compose 里的 Redis 服务名就是 redis。普通宝塔或 LNMP 环境通常使用本机 Redis,常见主机是 127.0.0.1。
Redis 安装边界
宝塔路径中,队列会通过宝塔安装脚本安装 Redis。安装后会尽量把 /www/server/redis/redis.conf 绑定到本机:
bind 127.0.0.1原生 LNMP 路径中,队列会通过系统包管理器安装 redis-server 或 redis,并启动服务。
Redis 不应该默认暴露到公网。除非你明确做了内网访问控制、密码和安全组隔离,否则不要开放 6379 到外部网络。大多数单机 WordPress 站点只需要本机访问。
PHP Redis 扩展
PHP Redis 扩展必须安装到“站点实际使用的 PHP 版本”。很多服务器同时存在命令行 PHP、宝塔 PHP、系统 PHP 和多个 PHP-FPM 版本。命令行 php -m 看到 redis,不代表当前站点 PHP-FPM 已加载 redis。
宝塔路径中,队列会按 PHP 版本执行安装,并重启对应 PHP-FPM:
/etc/init.d/php-fpm-82 restart原生 LNMP 路径会优先安装版本包,例如:
apt-get install -y php8.2-redis验证扩展:
php -m | grep -i redis
php -r 'echo phpversion("redis") ?: "";'如果站点实际用的是宝塔 PHP,请用宝塔 PHP 路径验证,例如:
/www/server/php/82/bin/php -r 'echo phpversion("redis") ?: "";'WordPress 对象缓存
Redis 服务和 PHP Redis 扩展准备好后,WordPress 还需要对象缓存插件或 object-cache.php drop-in。常见流程:
- 安装 Redis 对象缓存插件。
- 配置 Redis 主机、端口和数据库。
- 启用对象缓存。
- 在插件面板确认连接成功。
- 打开首页、文章页、用户中心、商城、论坛做一次完整测试。
对象缓存主要减少数据库重复查询。它不会自动缓存整页 HTML,也不会让图片变小。页面打开慢时,先判断慢在 PHP、数据库、远程接口、图片资源还是 CDN 回源,不要把所有慢都归因到 Redis。
OPcache
OPcache 缓存 PHP 编译后的字节码。它对 WordPress 和子比主题这种 PHP 文件较多的站点非常有价值,通常建议生产站开启。
部署队列会检测:
phpversion("Zend OPcache")
phpversion("opcache")安装后会写入或确认这些基础配置:
opcache.enable=1
opcache.enable_cli=1
opcache.memory_consumption=128
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60opcache.revalidate_freq=60 表示 PHP 文件变更后,OPcache 可能最多延迟一段时间才检查更新。主题或插件刚更新后,如果页面仍像旧代码,先重启 PHP-FPM 或清理 OPcache,再清页面缓存和 CDN。
开启顺序
推荐上线顺序:
- 跑通 WordPress、主题、固定链接、登录和媒体上传。
- 确认 PHP 扩展齐全。
- 开启 OPcache。
- 安装 Redis 服务和 PHP Redis 扩展。
- 启用 WordPress Redis 对象缓存插件。
- 检查用户中心、商城、论坛、支付和消息。
- 再开启页面缓存。
- 最后接入 CDN 和静态资源缓存。
不要在源站还没稳定时同时开启 OPcache、Redis、页面缓存、CDN、JS 合并和 WAF。问题叠加后很难判断是哪一层造成的。
子比主题动态页面
这些功能不要被页面缓存固定:
| 功能 | 风险 |
|---|---|
| 登录注册 | 验证码、登录态、跳转地址被缓存 |
| 用户中心 | 余额、积分、消息、会员状态显示错 |
| 商城购物车 | 购物车数量、地址、优惠、订单状态错 |
| 支付回调 | 支付平台回调被缓存或拦截 |
| 评论和点赞 | Ajax 响应被缓存,状态不更新 |
| 私信和通知 | 未读数、消息状态显示错 |
| 前台投稿 | 表单 nonce、上传状态、审核结果错 |
页面缓存和 CDN 规则见 伪静态、缓存与 CDN。Redis 对象缓存通常可以开启,但遇到数据不刷新时要先清对象缓存,再清页面缓存。
缓存清理顺序
排查缓存异常时,从近到远清理:
- 浏览器缓存。
- WordPress 页面缓存插件。
- Redis 对象缓存。
- OPcache 或重启 PHP-FPM。
- Nginx/OpenLiteSpeed 服务器缓存。
- CDN 缓存。
如果刚改了 PHP 文件,重点是 OPcache 和 PHP-FPM;如果刚改了主题设置、菜单、用户数据、论坛统计,重点是 Redis 对象缓存;如果只是静态资源没更新,重点是浏览器和 CDN。
常见问题
| 现象 | 优先检查 |
|---|---|
| Redis 插件连接失败 | Redis 服务是否启动、主机端口是否正确、PHP Redis 扩展是否加载 |
| 宝塔显示 Redis 已装但插件失败 | 站点 PHP 版本是否安装了 redis 扩展 |
| Docker 里 Redis 连接失败 | WP_REDIS_HOST 是否为 Compose 服务名,容器网络是否正常 |
| 更新主题后仍是旧效果 | OPcache、页面缓存、CDN 是否仍缓存旧文件 |
| 登录用户看到游客页面 | 页面缓存或 CDN 没有按登录 Cookie 绕过 |
| 用户余额/消息不刷新 | 对象缓存未清理或缓存插件缓存了用户页面 |
| 后台变慢 | 远程接口、数据库慢查询、对象缓存连接超时、插件冲突 |
| 页面更慢 | Redis 连接失败重试、缓存插件配置错误、过度合并 JS/CSS |
什么时候不要开
这些情况先别急着开 Redis 或页面缓存:
- 站点还没完成基础安装和固定链接配置。
- PHP 错误日志还有持续致命错误。
- 登录、支付、验证码、用户中心还没跑通。
- 不知道如何清理对象缓存和页面缓存。
- Redis 服务不是本机或内网,网络延迟很高。
- 多站点、集群或主从环境还没有明确缓存前缀和隔离方案。
OPcache 通常可以较早开启,但更新或调试频繁的测试环境可以适当降低缓存时间,避免每次改代码都需要重启 PHP。
与部署页面的关系
在线部署里的宝塔、Docker、LNMP 都会把 Redis 和 OPcache 当作环境组件处理:
| 部署方式 | Redis | PHP Redis | OPcache |
|---|---|---|---|
| 宝塔 | 通过宝塔软件安装器补齐 | 按 PHP 版本安装扩展 | 按 PHP 版本安装并写入基础配置 |
| Docker | Compose 启动 redis:7-alpine | 取决于 WordPress 镜像和扩展 | 取决于镜像配置 |
| LNMP | 通过系统包管理器安装 | 安装 php-redis 或版本包 | 安装 php-opcache 并写入基础配置 |
队列只负责环境层准备。WordPress 里的对象缓存插件、页面缓存插件和 CDN 规则仍需要站点管理员按实际功能启用和验证。
开发边界
- 高频 Hook 里不要每次请求都做慢查询或远程请求,先考虑对象缓存。
- 缓存 key 要带上用户、语言、设备或业务类型,避免串数据。
- 余额、积分、订单、会员、下载权限等数据不要只依赖缓存判断。
- 变更论坛统计、搜索筛选、菜单结构、用户徽章后,要考虑清理对象缓存。
- 支付回调、验证码、Ajax、用户中心和购物车不要被页面缓存。
- 更新主题或插件后,除了页面缓存和 CDN,也要检查 OPcache。
本页吸收了子比官网“使用 Redis 和 OPcache 为网站加速”公开教程,并结合本站在线部署队列的 Redis、PHP Redis 扩展、OPcache 检测与安装实现整理。