FrankenPHP不读取系统php.ini,必须通过Caddyfile的php_ini指令或YAML中ini_path指定自定义配置文件;修改后需reload生效,且worker模式下不支持热更新。

php.ini 文件生效。
FrankenPHP 把 PHP 运行时静态链接进二进制,它不读取系统默认的 /etc/php/*/cli/php.ini 或 /usr/local/lib/php.ini。你改了那些文件,FrankenPHP 完全无视。
FrankenPHP 的 php_ini 配置必须走它的原生入口
它只认自己配置体系里声明的 php_ini 指令,且仅在两个地方生效:
- Caddyfile 里的
frankenphp块中,用php_ini子指令逐条设置(推荐用于简单覆盖) - FrankenPHP 的 YAML 配置(如
/etc/frankenphp/frankenphp.yaml)中,在php:下用ini_path:指向一个自定义php.ini文件(适合大批量配置)
例如 Caddyfile 写法:
frankenphp {
php_ini memory_limit 512M
php_ini opcache.enable 1
php_ini date.timezone "Asia/Shanghai"
}
注意:php_ini 后面的值类型要匹配——布尔值写 1 或 0,字符串必须加双引号(含空格或斜杠时),否则解析失败。
为什么改系统 php.ini 没用?
FrankenPHP 启动时会绕过 PHP 的标准 ini 加载流程,而是由 Go 层直接调用 php_set_ini_entry() 注入配置。它压根不触发 php_ini_scanned_files() 或扫描 PHP_INI_SCAN_DIR。所以你在宝塔面板里点“PHP 设置”改的、或者用 vim /www/server/php/80/etc/php.ini 改的,对 FrankenPHP 进程零影响。
立即学习“PHP免费学习笔记(深入)”;
常见误判现象:
- 改完系统
php.ini,phpinfo()页面仍显示旧值 → 因为该页面是 FrankenPHP 渲染的,反映的是它内部注入的配置 - 执行
php -i | grep memory_limit看到的是 CLI 模式下的值 → 和 FrankenPHP 的 web 模式无关 - 用
get_cfg_var('opcache.enable')返回false→ 说明php_ini opcache.enable 1没写进 Caddyfile 或 YAML,不是 OPcache 没装
worker 模式下 php_ini 的作用域差异
如果你启用了 worker 模式(即常驻内存),php_ini 设置会在 worker 初始化时一次性加载,之后不会热更新。这意味着:
- 修改 Caddyfile 中的
php_ini后,必须sudo caddy reload或重启整个 FrankenPHP 进程才能生效 - 不能靠
opcache.revalidate_freq=0实现配置热重载 —— 这个参数只管 opcode 缓存刷新,不管 ini 设置本身 - 多个 worker 共享同一份 ini 配置,不存在 per-worker 覆盖机制
顺带一提:php_ini 不支持动态扩展加载语法(比如 extension=redis.so),扩展必须在编译 FrankenPHP 时内置,或通过 extensions: 字段在 YAML 中声明(仅限官方支持扩展列表)。
php -d memory_limit=1G script.php 一把梭。别漏掉 reload 步骤,这是最容易卡住的地方。



















