
当客户端通过 curl 以 Content-Type: text/plain 等非标准方式发送无字段名的原始数据(如 -d '111111,data,more')时,PHP 的 $_REQUEST 和 $_POST 均为空;此时必须使用 file_get_contents('php://input') 手动获取原始请求体。
当客户端通过 curl 以 `content-type: text/plain` 等非标准方式发送无字段名的原始数据(如 `-d '111111,data,more'`)时,php 的 `$_request` 和 `$_post` 均为空;此时必须使用 `file_get_contents('php://input')` 手动获取原始请求体。
在 Web 开发中,我们常依赖 $_POST 或 $_REQUEST 获取表单提交的数据。但这类超全局变量仅在 PHP 成功解析为“键值对”时才被填充——这要求请求满足两个前提:
- Content-Type 为 application/x-www-form-urlencoded 或 multipart/form-data;
- 请求体(body)符合对应格式(例如 key1=value1&key2=value2)。
而问题中的 curl 命令:
curl -H 'Content-Type: text/plain; charset=utf-8' -d '1111111111,data,more-data' -X POST https://www.testtest.com/
明确使用了 text/plain 类型,并直接发送纯文本字符串,未定义任何字段名(即不是 data=1111111111%2Cdata%2Cmore-data)。此时 PHP 不会尝试解析该内容,$_POST、$_GET、$_REQUEST 全部为空,$_SERVER['CONTENT_LENGTH'] 虽有值,但无对应数据映射。
✅ 正确解决方案:使用 php://input 流
php://input 是一个只读流,允许你直接读取原始 HTTP 请求体(raw request body),且不受 Content-Type 限制(除 multipart/form-data 外均可用)。它是处理 Webhook、API 接口、自定义协议等场景的标准方式。
向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。
立即学习“PHP免费学习笔记(深入)”;
示例代码(集成到你的脚本中):
// 在读取 $_REQUEST 和 headers 后,添加以下逻辑:
$rawInput = file_get_contents('php://input');
if ($rawInput !== false && $rawInput !== '') {
$rawData = trim($rawInput);
$r = "RAW INPUT:\n" . var_export($rawData, true) . "\n\n";
$file .= $r;
$html .= htmlspecialchars($r);
}? 关键注意事项:
- php://input 只能读取一次(流不可重放),多次调用将返回空字符串;
- 它不适用于 enctype="multipart/form-data" 的请求(此时应使用 $_FILES);
- 确保 enable_post_data_reading = On(默认开启)且未启用 suhosin 等可能拦截输入的扩展;
- 若需 JSON 数据,可进一步解析:$json = json_decode($rawInput, true);;
- 日志中建议同时记录 $_SERVER['CONTENT_TYPE'] 和 $_SERVER['CONTENT_LENGTH'],便于调试数据格式是否匹配预期。
? 总结:
不要假设所有 POST 请求都会落入 $_POST——当接口文档或第三方服务(如 TradingView Webhook)明确使用 text/plain、application/json 或自定义文本格式时,请始终优先检查 php://input。这是 PHP 处理“原始负载(raw payload)”的权威机制,也是构建健壮 API 接收端的基础实践。


















