很多独立站慢,不是因为服务器差,是因为每个请求都在重复做同样的事:重新编译 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 毫秒 |
差一到两个数量级。
安装步骤
- 装 Redis 服务:宝塔软件商店 → 安装 Redis
- 装 PHP 的 redis 扩展:PHP → 安装扩展 → redis
- WordPress 装插件:Redis Object Cache(免费的这个就够用)
- 后台 → 设置 → 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 商城:可以用,但要配置「购物车页、结算页、我的账户页不缓存」
- 有会员系统的站:谨慎配置,或者只给未登录用户缓存
六、配置顺序建议
如果你现在什么都没配,按这个顺序来,每一步都能看到效果:
- 先开 OPcache(5 分钟,零风险,立竿见影)
- 再装 Redis(10 分钟,注意安全设置)
- 最后加页面缓存(15 分钟,需要测试动态功能)
每做一步,用浏览器 F12 的 Network 面板看 TTFB(首字节时间)的变化。正常能观察到明显的递减。
七、怎么衡量有没有效果
别凭感觉。用同一个页面、同样的条件测三次取平均:
- 浏览器 F12 → Network → 访问页面 → 看第一个请求的 Timing / TTFB
- 装 Query Monitor 插件,看页面底部的「数据库查询次数」和「生成时间」
- 用 GTmetrix 或 PageSpeed Insights 跑分对比
重点看 Query Monitor 里的数据库耗时——开 Redis 之后,这个数字应该显著下降。如果没变化,说明缓存没生效,回去检查连接状态。
最后
性能优化有个误区:很多人一上来就想着换更贵的服务器。但在换服务器之前,先把免费的缓存开好——很多时候,配好 OPcache + Redis 的 2 核 4G,比裸跑的 4 核 8G 还快。
这半小时的配置,能省下你每年几千块的服务器升级费用。