frankenphp默认request_body_buffer_size仅1mb,超限请求体被静默截断,需在frankenphp.yaml中设为2的幂(如16777216),并重启进程;同时调大php.ini中post_max_size、upload_max_filesize等参数。

FrankenPHP 对大请求体(如超过 1MB 的 JSON 或 multipart 文件)默认会截断,导致 Symfony 接收到不完整请求体,json_decode($request->getContent()) 返回 null,或表单字段丢失、$request->files 为空——这不是 Symfony 配置问题,而是 FrankenPHP 的底层限制在起作用。
FrankenPHP 的 request_body_buffer_size 默认值太小
FrankenPHP 使用 request_body_buffer_size 控制内存中缓存的请求体上限,默认仅 1MB。超过部分会被静默丢弃,不会报错,但 Symfony 拿不到完整数据。
- 检查当前值:
frankenphp -c /path/to/config.yml --dump-config | grep request_body_buffer_size - 修改方式:在 FrankenPHP 配置文件(如
frankenphp.yaml)中显式设置,例如:server: request_body_buffer_size: 16777216 # 16MB
- 注意:该值必须是 2 的幂(如 8388608、16777216),否则 FrankenPHP 启动失败并报
invalid request_body_buffer_size - 改完后必须重启 FrankenPHP 进程(不是 reload),且确认进程已加载新配置(可加
--verbose启动观察日志)
Symfony 层仍需同步调大 php.ini 限制
FrankenPHP 放行了大请求体,但 PHP 自身的解析器仍可能拒绝处理——尤其对 application/json 和 multipart/form-data 两类内容。
- 确保
post_max_size≥ 你预期的最大请求体(如16M) -
upload_max_filesize必须 ≥ 单个上传文件最大尺寸(与post_max_size无直接大小关系,但实际总和不能超后者) -
max_input_time建议设为-1或足够大(如300),避免大请求在解析阶段超时中断 - 这些配置需写入 FrankenPHP 加载的
php.ini(不是 CLI 的 php.ini),可通过phpinfo()页面确认生效位置
如何验证是否仍是 FrankenPHP 截断而非 Symfony 解析失败
最直接的办法:绕过 Symfony,用 FrankenPHP 的原生 PHP 处理器看原始输入。
- 新建一个
/test-raw.php路由,内容为:<?php file_put_contents('/tmp/raw-body.log', file_get_contents('php://input'), FILE_APPEND); echo 'OK'; - 用
curl -X POST -H "Content-Type: application/json" --data-binary @large.json http://localhost/test-raw.php发送大请求 - 检查
/tmp/raw-body.log是否完整。若日志被截断 → 是 FrankenPHP 层问题;若完整但 Symfony 中$request->getContent()为空 → 是 Symfony 的 Request 创建逻辑或 Content-Type 解析异常(比如漏设Content-Type: application/json)
Symfony 中安全读取大 JSON 请求体的兜底写法
即使配置正确,网络波动或客户端异常仍可能导致 $request->getContent() 返回空或无效 JSON。别依赖 json_last_error() 后再抛异常,应主动校验。
- 不要这样写:
$data = json_decode($request->getContent(), true); if (json_last_error() !== JSON_ERROR_NONE) { throw new BadRequestHttpException('Invalid JSON'); } - 推荐写法:
$raw = $request->getContent(); if ($raw === '' || !is_string($raw)) { throw new BadRequestHttpException('Empty request body'); } $data = json_decode($raw, true); if (!is_array($data) || json_last_error() !== JSON_ERROR_NONE) { throw new BadRequestHttpException('Invalid or malformed JSON'); } - 关键点:
$request->getContent()在大请求下可能返回false(而非空字符串),需显式判断;json_decode()失败时返回null,但null也是合法 JSON,所以必须结合json_last_error()判断
真正容易被忽略的是:FrankenPHP 的 request_body_buffer_size 修改后,必须彻底重启服务进程,且要确认它加载的是你改的那个配置文件——因为 FrankenPHP 会按固定顺序查找配置,./frankenphp.yaml、/etc/frankenphp.yaml、环境变量等可能互相覆盖。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











