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
相关产品推荐
相关产品推荐

