frankenphp中wordpress启用redis对象缓存需四步:一、手动安装php83-redis扩展并配置;二、在wp-config.php中硬编码redis连接参数(host填容器名,禁用predis);三、正确部署object-cache.php并重启服务;四、多站点必须设置唯一wp_redis_prefix防键冲突。

FrankenPHP里WordPress用Redis对象缓存,得先确认PHP扩展是否就绪
FrankenPHP默认不带redis扩展,光装了Redis服务没用——PHP进程根本连不上。你得手动编译或启用它。常见错误是启用了插件但wp-admin直接500,或者插件设置页报“Redis extension not loaded”。检查方式很简单:php -m | grep redis,没输出就说明扩展缺失。
如果你用的是FrankenPHP官方Docker镜像(比如frankenphp:1.2),它默认不含redis扩展。必须自己构建镜像,在Dockerfile里加这三行:
RUN apk add --no-cache php83-redis RUN ln -sf /usr/lib/php83/modules/redis.so /usr/lib/php83/modules/redis.so RUN echo "extension=redis.so" > /etc/php83/conf.d/redis.ini
注意:FrankenPHP用的是PHP 8.3(截至2026年10月),所以模块名和路径必须匹配php83-前缀,别错写成php82-或漏掉.so后缀。
wp-config.php里定义Redis连接,不能只靠插件UI
Redis Object Cache这类插件的“Settings”页面只是个壳,真起作用的是wp-config.php里的define()。FrankenPHP下尤其如此——它绕过传统PHP-FPM生命周期,某些运行时变量初始化顺序不同,插件UI填的配置可能被忽略。
必须手动加这几行(位置在/* That's all, stop editing! */之前):
define('WP_REDIS_HOST', 'redis'); // 容器名,不是127.0.0.1
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_TIMEOUT', 1.0);
define('WP_REDIS_READ_TIMEOUT', 1.0);
define('WP_REDIS_MAXTTL', 3600 * 24); // 避免transient永不过期
关键点:
-
WP_REDIS_HOST填容器名(如redis),不是127.0.0.1——FrankenPHP跑在容器里,localhost指向自身,不是宿主机或Redis容器 - 别开
WP_REDIS_CLIENT,FrankenPHP目前只稳定支持phpredis,设成predis会静默失败 -
WP_REDIS_MAXTTL强烈建议设值,否则transient可能永久滞留,拖慢flush_all
object-cache.php必须放对位置,且不能被FrankenPHP缓存机制干扰
插件启用后,它会尝试把object-cache.php复制到wp-content/根目录。但FrankenPHP的文件加载机制更激进,如果这个文件权限不对、或被OPcache预编译过,会导致对象缓存完全不生效——现象是wp-admin里插件显示“Connected”,但Query Monitor里Object Cache Hits始终为0。
操作步骤:
- 删掉
wp-content/object-cache.php(如果有) - 从
wp-content/plugins/redis-object-cache/object-cache.php复制一份过去 - 确保该文件权限是
644,且属主与FrankenPHP worker进程一致(通常是www-data) - 重启FrankenPHP服务(不是reload,是
docker restart或systemctl restart frankenphp),因为OPcache不会自动重载这个文件
验证是否生效:访问/wp-admin/tools.php?page=redis-object-cache,看“Status”栏是不是Connected,再点“Debug Info”,确认Client显示phpredis而非unknown。
多站点环境要加前缀,否则缓存互相污染
FrankenPHP常被用于托管多个WordPress站点(比如用server_name路由),这时候所有站共用一个Redis DB,wp_options缓存键名一样,A站改个主题设置,B站菜单就消失——这是真实踩过的坑。
解决方法是在每个站点的wp-config.php里加独立前缀:
define('WP_REDIS_PREFIX', 'site1_'); // 第一个站
// define('WP_REDIS_PREFIX', 'site2_'); // 第二个站
前缀必须以字母开头、只含字母数字和下划线,长度别超16字符。别用$_SERVER['HTTP_HOST']动态生成——FrankenPHP里$_SERVER某些字段可能为空,导致前缀变成空字符串,全站缓存键撞车。
这个细节容易被忽略,直到某天发现后台更新失败、小工具莫名消失,才回去翻Redis里实际存的key,看到一堆没前缀的wp_:options:...才反应过来。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











