You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu下PHP无法获取ESP32发送的分块编码POST请求数据

问题分析与解决方案

1. Apache配置排查

  • Apache 2.4默认支持HTTP/1.1的chunked传输编码,但需确认无配置干扰:
    • 检查apache2.conf或站点配置文件,确保未通过SetEnvIf、RequestHeader等规则篡改请求体;
    • 确认LimitRequestBody配置为0(无限制),若设置过小可能截断流式数据;
    • 无需额外启用特定模块(如mod_deflate不影响chunked解析),但确保核心HTTP模块正常加载。

2. PHP端读取方式优化

不要仅依赖file_get_contents('php://input'),尝试流式读取更可靠:

$inputStream = fopen('php://input', 'rb');
$postData = stream_get_contents($inputStream);
fclose($inputStream);
file_put_contents('/tmp/esp32_post_data.log', $postData);

同时检查PHP配置:

  • 确认php.ini中enable_post_data_reading = On(默认开启,若关闭会直接禁用POST数据读取);
  • 核对post_max_size、upload_max_filesize设置,避免因限制导致数据丢失(空数据场景下此概率较低)。

3. ESP32请求格式校验

Wireshark确认数据发送后,需检查chunked编码格式是否严格符合HTTP/1.1规范:

  • 每个数据块格式必须为:[十六进制长度]\r\n[块内容]\r\n;
  • 最后必须以0\r\n\r\n标识请求体结束;
    示例正确格式:
5\r\n
Hello\r\n
0\r\n
\r\n

若ESP32发送的chunk缺少换行符、长度计算错误,Apache会无法解析请求体,导致PHP读取为空。

4. 日志与模拟测试

  • 查看Apache错误日志(路径通常为/var/log/apache2/error.log),查找chunked解析失败的警告或错误信息;
  • 用curl模拟chunked请求,排除ESP32端问题:
curl -X POST http://你的服务地址/目标脚本.php \
  -H "Transfer-Encoding: chunked" \
  --data-binary @- << EOF
5
Hello
0

EOF

若curl请求能被PHP正常读取,说明问题出在ESP32的请求编码逻辑;若仍为空,则聚焦服务端配置排查。

内容的提问来源于stack exchange,提问作者Gaston Melo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 10:59:53