frankenphp独立二进制只读取编译时嵌入的php.ini或构建时用--php-ini指定的配置,运行时不扫描phprc、-c参数、/etc/php/等任何外部路径,phpinfo()显示embedded://php.ini即证明此机制。

FrankenPHP 独立二进制根本不会读取当前目录下的 php.ini、.env 或任何外部配置文件——它只认编译时 embed 进去的配置,或构建时用 --php-ini 显式指定的那个。
为什么 php.ini 放在项目根目录或 /usr/local/lib/ 都不生效
独立二进制启动时跳过全部传统 PHP 的配置查找逻辑:不扫描 PHPRC 环境变量、不检查 -c 参数(该参数被完全忽略)、也不读取系统默认路径如 /etc/php/*/cli/php.ini。它直接从 Go 的 embed.FS 加载内置模板,路径硬编码在 caddy/php/php.go 里。
- 执行
./frankenphp --help,输出里根本没有-c或--php-ini选项 -
phpinfo()中显示的Loaded Configuration File是embedded://php.ini或(none),不是你放的路径 - 即使你
COPY custom.php.ini /usr/local/lib/php.ini到 Docker 容器,也毫无作用
--php-ini 参数为何有时像“没反应”
这个参数只在 frankenphp build 阶段有效,用于把指定 ini 文件 embed 进新二进制;它对已构建好的运行时二进制(如官方下载的 frankenphp)完全无效。
- 错误用法:
./frankenphp --php-ini my.ini php-server→ 报错unknown flag或静默忽略 - 正确用法:
frankenphp build --output app --php-ini ./my.ini --document-root public/ - 注意:
my.ini必须包含完整配置项,不能只写upload_tmp_dir = "/tmp/uploads"就完事——缺失的其他项会 fallback 到内置默认值,可能引发意料外行为
框架配置(如 .env、config/app.php)为什么不随代码更新
FrankenPHP 构建过程会把框架的配置解析结果固化进二进制:Laravel 的 config:cache、Symfony 的 cache:warmup 都在打包前完成,.env 被读取一次后转为常量,后续运行时不再访问这些文件。
- 改了
.env后直接重启进程?没用,旧缓存还在二进制里 - 改了
config/cache.php但php artisan config:clear没在构建前执行?新配置压根没进缓存数组 - 构建时没设
APP_ENV=prod?框架可能以调试模式初始化,导致类加载路径和运行时行为不一致
真正生效的配置点只有两个:构建时嵌入的 php.ini(影响 memory_limit、opcache.enable 等),以及构建前注入的环境变量(影响框架启动逻辑)。其余一切“改完就生效”的直觉,在 FrankenPHP 独立二进制里都是陷阱。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











