FrankenPHP大JSON被截断主因是底层配置未适配:需调高php.ini中post_max_size、memory_limit等参数,改用file_get_contents('php://input')读取原始体,并检查Caddy/Nginx的request_body_max_size或client_max_body_size限制。

FrankenPHP 接收大 JSON 数据被截断,本质不是 FrankenPHP 自身的缺陷,而是它运行时所依赖的底层配置(PHP 设置、Web 服务器限制、缓冲机制)未适配大数据量场景。修复需从三方面入手:确保原始请求体完整抵达 PHP 层、让 PHP 正确读取整段数据、并在解析前处理可能的格式瑕疵。
检查并调高 PHP 输入限制
FrankenPHP 使用标准 PHP SAPI,因此 php.ini 中的关键参数仍起决定性作用:
-
post_max_size:必须 ≥ 实际 JSON 字符串字节数(注意 base64 或嵌套结构带来的膨胀),建议设为
128M或更高 -
memory_limit:读取
php://input并执行json_decode()需要足够内存,至少是 JSON 大小的 2–3 倍,例如设为256M - max_input_vars:如果你是用表单键值对方式提交(非纯 JSON),该值限制字段总数,默认 1000,大数组易被砍断;若走 JSON body,则此项不影响,可忽略
-
max_execution_time 和 max_input_time:避免超时中断接收,建议设为
300或0(不限制)
修改后需重启 FrankenPHP 进程(如通过 systemctl restart frankenphp 或重新运行 frankenphp serve),用 phpinfo() 确认生效。
强制读取完整原始输入流
前端发送的是 Content-Type: application/json,此时 $_POST 必为空——这是正常行为,不是 bug。必须跳过 $_POST,直接读取原始 body:
立即学习“PHP免费学习笔记(深入)”;
- 使用
file_get_contents('php://input')获取完整原始数据(仅一次,不可重复读) - 不要用
$HTTP_RAW_POST_DATA(已废弃)或fgets(fopen('php://input'))(易截断) - 示例代码:
<?php
$raw = file_get_contents('php://input');
if ($raw === false || $raw === '') {
http_response_code(400);
exit('Empty request body');
}
$data = json_decode($raw, true);
if (json_last_error() !== JSON_ERROR_NONE) {
http_response_code(400);
exit('Invalid JSON: ' . json_last_error_msg());
}
// 后续处理 $data
?>
应对不规范 JSON 的容错解析
即使数据完整送达,若上游生成的 JSON 存在引号嵌套错误(如 "name": "John "Doe" Smith")、尾部逗号、单引号混用等,json_decode() 仍会失败。这时可引入轻量修复工具:
- 推荐使用
adhocore/json-fixer:零依赖 PHP 库,能自动补全缺失括号、引号,修正常见截断/格式错误 - 安装:
composer require adhocore/json-fixer - 使用示例:
<?php
use Ahc\Json\Fixer;
$raw = file_get_contents('php://input');
$fixed = Fixer::fix($raw); // 智能修复
$data = json_decode($fixed, true);
?> - 对已知模式错误(如内部双引号未转义),也可先用正则预处理,但通用性不如专用修复库
确认 Web 层无额外拦截
FrankenPHP 常与 Caddy 或 Nginx 共同部署,这些反向代理也可能截断大请求:
- Caddy:检查
request_body_max_size(默认 10MB),在路由块中显式增大,例如request_body_max_size 256mb - Nginx:确认
client_max_body_size已设为足够值(如512m),且该指令位于http、server或location块中生效 - 两者均需重载配置(
caddy reload或nginx -s reload)



















