frankenphp 使用 embed sapi,导致 max_execution_time、pm.* 等 php.ini 配置静默失效;upload_max_filesize 等行为由 caddy 控制;扩展需在 caddyfile 声明,php.ini 路径默认为 /etc/php/8.x/embed/php.ini。

FrankenPHP 用的是 PHP 的嵌入式 SAPI(embed),不是传统 fpm 或 apache2handler,所以大量依赖 Web 服务器层或进程模型的 php.ini 配置会直接失效——不是“没读到”,而是“读了但被忽略”。
哪些配置在 FrankenPHP 中完全被忽略
以下指令在 embed SAPI 下无实现逻辑,修改后既不报错也不生效,属于“静默丢弃”:
-
max_execution_time:FrankenPHP 由 Caddy 控制请求超时,PHP 层的执行时间限制被绕过;设为30或0都无效 -
request_terminate_timeout(FPM 特有):FrankenPHP 没有该配置项,写进php.ini会被跳过 -
pm.*系列(如pm.max_children,pm.start_servers):FrankenPHP 不管理进程池,这些是php-fpm.conf的专属配置 -
log_errors_max_len:错误日志长度截断由 Caddy 的日志模块或系统syslog控制,PHP 自身不干预 -
ignore_user_abort:FrankenPHP 不支持“后台持续运行脚本”,该行为在 embed SAPI 下未启用
哪些配置虽存在但行为已改变
部分指令仍能解析,但语义和作用域和 FPM/Apache 完全不同:
-
upload_max_filesize和post_max_size:FrankenPHP 不做表单解析,这两项仅影响$_FILES和$_POST的原始解析逻辑;实际上传限制由 Caddy 的body_limit控制(例如body_limit 64MiB) -
session.save_handler:若设为files,仍会写入本地目录,但 FrankenPHP 默认不自动清理过期 session 文件(无session.gc_*定时触发机制) -
opcache.enable_cli:FrankenPHP 启动时加载的 PHP 脚本走的是 CLI-like 初始化路径,但opcache.enable_cli=1并不会让路由处理器中的脚本命中 OPcache——必须显式设opcache.enable=1且确保opcache.revalidate_freq=0 -
error_log:值仍被读取,但实际日志输出目标由 Caddy 的log指令接管;PHP 写入的错误可能被合并进 Caddy 主日志,而非独立文件
哪些配置必须改用 FrankenPHP 原生方式替代
FrankenPHP 提供了自己的配置入口,硬塞进 php.ini 不但无效,还可能干扰启动:
- PHP 运行模式切换(如开发/生产):不再靠
display_errors+error_reporting组合,而应使用CADDY_ENV=production环境变量,FrankenPHP 会据此禁用详细错误页 - 扩展加载顺序与条件启用:FrankenPHP 要求扩展通过
frankenphp_extensions数组在Caddyfile中声明,extension=行在php.ini中会被加载,但某些扩展(如curl,openssl)若未在 Caddyfile 中显式列出,可能无法在 HTTP 上下文中正常工作 - 时区设置:
date.timezone仍有效,但 FrankenPHP 推荐优先用FRANKENPHP_TIMEZONE环境变量,它会在更早阶段注入,避免部分扩展(如intl)初始化失败
最常被忽略的一点:FrankenPHP 的 php.ini 加载路径默认只认 /etc/php/8.x/embed/php.ini(或编译指定路径),你改的 fpm 或 cli 目录下的 php.ini 完全不参与启动。确认方式只有 php -d sapi.embed=1 --ini,而不是 php --ini。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











