frankenphp 不加载 /usr/local/etc/php/php.ini,仅识别如 /etc/php/8.3/frankenphp/php.ini 等特定路径;需用 frankenphp --php-ini 查看目标路径,并通过 web 访问 info.php 确认 loaded configuration file 才是真实生效配置。

FrankenPHP 容器里改 php.ini 不生效,根本原因不是“没重启”,而是“压根没被加载”
FrankenPHP 是基于 SAPI(frankenphp)运行的,它不走传统 PHP-FPM 的启动流程,也不读取 /usr/local/etc/php/php.ini 主配置文件——除非你显式指定。官方镜像默认只加载 /etc/php/8.3/cli/php.ini 或 /etc/php/8.3/frankenphp/php.ini(路径依版本而异),且仅当该文件存在并被 frankenphp 二进制识别时才生效。直接进容器改 /usr/local/etc/php/php.ini,FrankenPHP 根本不会去看它。
怎么确认 FrankenPHP 实际加载的是哪个 php.ini
别猜,用 frankenphp 自带命令验证:
- 进容器执行
frankenphp --php-ini,输出的就是它当前尝试加载的路径(注意:不是最终是否成功加载) - 在 Web 环境下放
info.php(内容为<?php phpinfo(); ?>),访问后搜索Loaded Configuration File—— 这个值才是真实生效的路径 - 如果该行显示
none,说明 FrankenPHP 没找到任何php.ini,所有配置都回退到编译默认值
真正有效的修改方式只有两种
FrankenPHP 不支持运行时重载 ini,也不接受挂载到 /usr/local/etc/php/conf.d/(它不扫描这个目录)。必须对齐它的加载逻辑:
- 使用
volumes挂载自定义php.ini到它实际查找的路径,例如:./my-php.ini:/etc/php/8.3/frankenphp/php.ini(路径需和frankenphp --php-ini输出一致) - 或在
Dockerfile中COPY配置到对应位置,并确保该路径在镜像内已存在(FrankenPHP 启动时会检查父目录是否存在) - 千万别用
RUN echo "..." >> /etc/php/8.3/frankenphp/php.ini—— 容器构建时该路径可能还不存在,或权限不对,导致静默失败
常见踩坑点:改了但 phpinfo() 显示仍是旧值
这往往不是配置没生效,而是你看到的 phpinfo() 来自 CLI 模式或另一个 SAPI:
- FrankenPHP 的 Web 请求走的是
frankenphpSAPI,而你在终端执行php -i走的是 CLI SAPI,两者加载的php.ini完全不同 - 务必用 Web 方式访问
info.php查看,且确认 URL 是经 FrankenPHP 路由处理的(比如通过localhost:8080,而非直连 PHP CLI) - 如果你用了
frankenphp --proxy模式,还要检查反向代理是否把请求正确转发给了 FrankenPHP 实例,而不是绕过它直连了其他 PHP 服务
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











