frankenphp必须通过--php-config指定绝对路径的php.ini文件,否则使用极简内置配置导致symfony启动失败;关键项包括opcache.enable=1、realpath_cache_size=4096k、date.timezone="utc"等,且fpm专属参数无效。

FrankenPHP 不会自动加载系统级 php.ini,也不读取 /etc/php/*/cli/php.ini 或 /usr/local/etc/php/php.ini 这类路径——它只认自己启动时显式指定的配置文件。直接复用传统 PHP-FPM 的 php.ini 会导致 Symfony 启动失败、opcache 不生效、甚至 $_SERVER 变量缺失。
FrankenPHP 怎么指定自定义 php.ini 文件
必须通过 --php-config 命令行参数传入绝对路径,不能靠环境变量或自动发现:
-
frankenphp run --php-config /app/config/php.ini是唯一可靠方式 - 如果用
docker run,需确保该文件已挂载进容器且路径可读(如-v $(pwd)/php.ini:/app/config/php.ini) - 不加
--php-config时,FrankenPHP 使用极简内置配置,memory_limit默认仅 128M,opcache.enable为Off,Symfony 的var/cache写入会因realpath()失败而报错 - Caddyfile 里无法声明
php.ini路径,所有 PHP 运行时参数必须由该参数统一控制
Symfony 生产环境必需的 php.ini 项
Symfony 对 php.ini 敏感度远高于普通脚本:它依赖 opcache 加速容器编译、需要 realpath_cache_size 缓存大量路径、且对 upload_max_filesize 和 post_max_size 有明确校验逻辑。以下几项不设对,bin/console cache:warmup 就会卡住或报错:
-
opcache.enable=1且opcache.enable_cli=1(CLI 模式下 warmup 需要) -
opcache.memory_consumption=256(低于 128M 时,大型 bundle 编译失败) -
realpath_cache_size=4096K(默认 4K,Symfony 扫描 vendor 时频繁stat()超时) -
date.timezone="UTC"(不设会导致 Doctrine ORM 时间戳行为异常) -
upload_max_filesize=20M和post_max_size=22M(必须满足post_max_size > upload_max_filesize,否则表单上传直接 500) -
session.cookie_secure=1和session.cookie_httponly=1(HTTPS 环境下未设会导致 Symfony Security 报Invalid cookie)
为什么不能直接复制 php-fpm 的 php.ini
FrankenPHP 的 PHP 运行时是嵌入式 libphp,不是独立进程,部分 FPM 专属指令在 FrankenPHP 下无效或触发警告:
-
pm.*类参数(如pm.max_children)完全无意义,FrankenPHP 用 Go 调度 worker,不走 PHP-FPM 进程池模型 -
clear_env=off在 FrankenPHP 下被忽略,环境变量始终继承自 Caddy 进程,需改用CADDY_ENV或env块注入 -
security.limit_extensions不生效,FrankenPHP 仅执行.php后缀文件,不支持扩展名白名单机制 -
expose_php=Off必须显式写入,否则X-Powered-By头仍会暴露版本(FrankenPHP 默认开启)
验证 php.ini 是否生效的最快方法
别依赖 phpinfo() 页面——FrankenPHP 的 phpinfo() 输出不包含所有 ini 设置,且可能缓存旧值。用 CLI 直接检查最准:
frankenphp run --php-config /app/config/php.ini -- -i | grep -E "(opcache.enable|realpath_cache_size|date.timezone)"
输出应为实际值,而非 no value 或空行。若看到 opcache.enable => Off,说明路径错、权限不足,或配置语法有误(比如漏了等号、用了中文引号)。
最容易被忽略的是 opcache.validate_timestamps=0 在 worker 模式下的副作用:它会让 Symfony 缓存永不过期,但开发时改代码不生效;生产部署必须配成 1 并配合 opcache.revalidate_freq=2,否则上线后热更新失效。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











