网站运维

OPcache 和 Redis 配置实战:让 WordPress 少算一半

很多独立站慢,不是因为服务器差,是因为每个请求都在重复做同样的事:重新编译 PHP 代码、重新查一遍数据库。

OPcache 解决第一个问题,Redis 解决第二个。两个加起来,页面生成时间通常能降 40-60%,而且配置加起来不到半小时。

更关键的是:这两个都是免费的,只需要在服务器上开个扩展。

一、OPcache:让 PHP 不用每次都重新编译

它解决什么问题

PHP 是解释型语言。默认情况下,每次请求进来,服务器都要把 .php 源文件重新编译一遍成机器能执行的代码。WordPress 一次页面加载要加载几百个 PHP 文件,这个编译开销非常大。

OPcache 做的事:把编译结果缓存在内存里。第二次请求直接用缓存,跳过编译。

而且你的 PHP 代码是几乎不变的——每次都重新编译完全是在浪费。

宝塔里开启

软件商店 → 找到你用的 PHP 版本 → 安装扩展 → 装 opcache。

装完点「配置修改」,或者直接在 php.ini 里设置推荐参数:

[opcache]
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
opcache.revalidate_freq=60
opcache.save_comments=1
opcache.fast_shutdown=1

参数说明:

  • memory_consumption=128:缓存分配 128MB。WordPress + 常见插件够用。如果下面提到的命中率长期低于 90%,加到 256
  • max_accelerated_files=10000:最多缓存多少个文件。WordPress 站一般 3000-8000 个,设 10000 稳妥
  • revalidate_freq=60:60 秒检查一次文件是否修改。开发环境可以设 0(每次检查),生产环境设 60 或更高

改完重启 PHP。

怎么确认真的生效了

别以为装了就生效。验证方法:装个 OPcache 状态查看脚本,或者看 phpinfo。

更简单的办法:写一个临时文件放网站根目录:

<?php
$s = opcache_get_status();
echo '命中率: ' . round($s['opcache_statistics']['opcache_hit_rate'], 2) . '%<br>';
echo '已缓存文件数: ' . $s['opcache_statistics']['num_cached_scripts'] . '<br>';
echo '内存使用: ' . round($s['memory_usage']['used_memory'] / 1048576, 1) . ' MB';
?>

访问它,看:

  • 命中率 > 95%:正常
  • 命中率低于 90%:缓存太小,加大 memory_consumption
  • 如果显示内存快满了:同样加大

看完记得删掉这个文件,它会暴露服务器信息。

一个常见坑:改了代码没生效

OPcache 开启后,你改了 PHP 文件,网站可能还是显示旧内容——因为用的是缓存。

解决:

  • 重启 PHP 服务
  • 或者设 opcache.validate_timestamps=1 + 合理的 revalidate_freq
  • 开发调试期间可以临时关掉 OPcache

二、Redis 对象缓存:让重复的数据库查询不再查

它解决什么问题

WordPress 每次加载页面都要从 wp_options 读配置、查文章、查 meta 数据……这些查询的结果大部分每次都一样。

Redis 把这些查询结果缓存在内存里。第二次请求直接从内存读,不碰数据库。

对比一下访问速度:

存储 访问耗时(大约)
内存(Redis) 0.1 毫秒级
SSD 上的 MySQL 1-10 毫秒
机械硬盘上的 MySQL 10-100 毫秒

差一到两个数量级。

安装步骤

  1. 装 Redis 服务:宝塔软件商店 → 安装 Redis
  2. 装 PHP 的 redis 扩展:PHP → 安装扩展 → redis
  3. WordPress 装插件:Redis Object Cache(免费的这个就够用)
  4. 后台 → 设置 → Redis → 点「Enable Object Cache」

配置连接

如果 Redis 是本机默认配置,插件一般自动就能连上。如果改了端口或设了密码,在 wp-config.php 加:

define( 'WP_REDIS_HOST', '127.0.0.1' );
define( 'WP_REDIS_PORT', 6379 );
define( 'WP_REDIS_PASSWORD', '你的密码' );
define( 'WP_REDIS_TIMEOUT', 1 );
define( 'WP_REDIS_READ_TIMEOUT', 1 );
define( 'WP_REDIS_DATABASE', 0 );

验证生效

Redis Object Cache 插件的设置页会显示状态。看到 Connected 和 Hit Ratio 就对了。

命中率健康值:90% 以上。刚开启时低是正常的(缓存还没热起来),过一天再看。

三、Redis 的安全设置(别跳过)

Redis 有个恶名:默认无密码、监听所有网卡。这是挖矿木马最常见的入口之一。

装完必须做:

# 配置文件 /www/server/redis/redis.conf
bind 127.0.0.1              # 只监听本地
requirepass 一个强密码       # 设密码
protected-mode yes

改完重启 Redis。

再确认端口没对公网开放:

netstat -tulnp | grep 6379

应该显示 127.0.0.1:6379,而不是 0.0.0.0:6379。

四、什么时候不该用 Redis

不是所有站都适合。以下情况要谨慎:

1. 内存很小的服务器(1G 以下)

Redis 本身要占内存。如果你的服务器只有 512MB-1GB,装 Redis 可能让系统因为内存不足开始用 swap,反而更慢。

建议:2GB 以上内存再考虑 Redis。

2. 网站有非常频繁的写入

对象缓存对读多写少的场景效果最好。如果你的站是个论坛、或者每几分钟就有大量数据更新,缓存会频繁失效,收益打折扣。

3. 插件冲突

少数插件(尤其是有自己缓存机制的)可能和对象缓存冲突,表现为「改了设置不生效」或者「前台数据不更新」。

排查:禁用对象缓存看问题是否消失。如果是,需要在插件里配置排除项。

五、还有个更强的:页面缓存

OPcache + Redis 解决的是「让每个请求更便宜」。而页面缓存是「根本不执行 PHP」——直接把生成好的 HTML 发给访客。

对比:

方案 每次请求做什么 典型耗时
无缓存 编译 PHP + 查数据库 + 渲染 300-1000ms
+ OPcache 查数据库 + 渲染 150-500ms
+ Redis 渲染(数据从内存读) 80-300ms
+ 页面缓存 读一个静态文件 5-30ms

页面缓存的效果是碾压性的,但它有代价:动态内容(购物车、登录状态)需要特殊处理。

选型建议:

  • 纯展示型企业站:页面缓存收益最大,直接用
  • WooCommerce 商城:可以用,但要配置「购物车页、结算页、我的账户页不缓存」
  • 有会员系统的站:谨慎配置,或者只给未登录用户缓存

六、配置顺序建议

如果你现在什么都没配,按这个顺序来,每一步都能看到效果:

  1. 先开 OPcache(5 分钟,零风险,立竿见影)
  2. 再装 Redis(10 分钟,注意安全设置)
  3. 最后加页面缓存(15 分钟,需要测试动态功能)

每做一步,用浏览器 F12 的 Network 面板看 TTFB(首字节时间)的变化。正常能观察到明显的递减。

七、怎么衡量有没有效果

别凭感觉。用同一个页面、同样的条件测三次取平均:

  1. 浏览器 F12 → Network → 访问页面 → 看第一个请求的 Timing / TTFB
  2. 装 Query Monitor 插件,看页面底部的「数据库查询次数」和「生成时间」
  3. 用 GTmetrix 或 PageSpeed Insights 跑分对比

重点看 Query Monitor 里的数据库耗时——开 Redis 之后,这个数字应该显著下降。如果没变化,说明缓存没生效,回去检查连接状态。

最后

性能优化有个误区:很多人一上来就想着换更贵的服务器。但在换服务器之前,先把免费的缓存开好——很多时候,配好 OPcache + Redis 的 2 核 4G,比裸跑的 4 核 8G 还快。

这半小时的配置,能省下你每年几千块的服务器升级费用。