FrankenPHP 1.3 使用嵌入式 SAPI,仅加载启动时指定或编译默认的 php.ini(如 /usr/local/etc/php/php.ini),不读取 /etc/php/*/fpm/conf.d/;需通过 frankenphp.yaml 中 php.cli-flags: ["-c", "/path/to/php.ini"] 设置,且 [HOST=]、[PATH=] 段无效。

FrankenPHP 1.3 的 php.ini 加载路径不走传统 PHP SAPI 规则
FrankenPHP 不是 Apache 或 FPM,它用的是嵌入式 SAPI(embed),所以 php --ini 显示的路径、/etc/php/*/fpm/conf.d/ 这些目录完全不生效。它只认自己启动时指定的配置路径,或编译时硬编码的默认位置(通常是 /usr/local/etc/php/php.ini 或 $XDG_CONFIG_HOME/php/php.ini)。你改系统 PHP 的 conf.d 没用,重启 nginx/apache 也毫无影响。
必须用 -c 参数启动 FrankenPHP 才能加载自定义 php.ini
FrankenPHP 的 CLI 启动命令(比如 frankenphp 或 ./frankenphp server)本身不直接接受 -c,但它的底层是调用 PHP embed SAPI,所以真正起作用的是传给 PHP 子进程的参数。正确做法是:
- 在
frankenphp.yaml的php:下添加cli-flags: ["-c", "/path/to/your/custom.php.ini"] - 确保该
.php.ini文件存在、权限可读(FrankenPHP 进程用户如www-data必须能读) - 不要用
.ini后缀以外的扩展名(例如custom.conf),FrankenPHP 会静默忽略 - 验证是否生效:在脚本里加
echo get_cfg_var('memory_limit');,或运行frankenphp run --php-flags="-c /path/to/custom.php.ini" -r "echo ini_get('loaded_configuration_file');"
自定义 php.ini 中的 [HOST=] 和 [PATH=] 段在 FrankenPHP 里基本无效
FrankenPHP 当前(1.3 版)不实现 Apache/Nginx 风格的虚拟主机或路径上下文隔离,所以 [HOST=dev.local] 或 [PATH=/api] 这类段落会被解析但不会触发条件匹配。所有指令都按全局作用域处理。如果你依赖这些段做多环境切换,得换成运行时逻辑:
- 用
$_SERVER['HTTP_HOST']或$_SERVER['REQUEST_URI']在入口脚本中手动ini_set() - 或者为不同场景准备多个独立的
frankenphp.yaml+ 对应php.ini,用frankenphp --config=dev.yaml切换 -
display_errors、error_reporting这类INI_ALL级别指令可以安全设在自定义 ini 里;但extension=必须用绝对路径,且.so 文件需兼容 FrankenPHP 的 PHP 构建版本(不能混用系统 PHP 的扩展)
常见失效原因:CLI vs HTTP 请求走的是两套配置加载逻辑
FrankenPHP 启动时会 fork 出两个角色:一个长期运行的 HTTP server 进程,另一个是按需启动的 PHP worker(类似 CGI 模式)。它们可能加载不同的配置:
立即学习“PHP免费学习笔记(深入)”;
- HTTP 请求用的是
frankenphp.yaml中php.cli-flags指定的 ini; - 而你用
frankenphp run手动执行 CLI 脚本时,若没显式传-c,它会 fallback 到 embed SAPI 默认路径(不是php --ini那个); - 最稳的验证方式:写一个
test.php,内容为<?php echo "Loaded: " . (ini_get("loaded_configuration_file") ?: "none"); ?>,然后分别用frankenphp run test.php和发 HTTP 请求访问它,对比输出; - 别信
phpinfo()顶部 “Loaded Configuration File” —— FrankenPHP 的 embed SAPI 有时会显示空或错误路径,以实际ini_get("loaded_configuration_file")返回值为准。



















