PHP 获取 POST 请求头及参数的正确方法
本文详解如何通过PHP原生方式(file_get_contents+stream_context_create)发送带表单数据的POST请求,并在服务端准确捕获完整的HTTP请求头及原始请求体,避免误用exec(curl)导致的上下文丢失与安全风险。

本文详解如何通过 PHP 原生方式(file_get_contents + stream_context_create)发送带表单数据的 POST 请求,并在服务端准确捕获完整的 HTTP 请求头及原始请求体,避免误用 exec(curl) 导致的上下文丢失与安全风险。
本文详解如何通过 PHP 原生方式(`file_get_contents` + `stream_context_create`)发送带表单数据的 POST 请求,并在服务端准确捕获完整的 HTTP 请求头及原始请求体,避免误用 `exec(curl)` 导致的上下文丢失与安全风险。
在 PHP 中调试 POST 请求时,一个常见误区是混淆「请求头(Request Headers)」与「请求体(Request Body)」——你当前代码中试图通过 apache_request_headers() 打印客户端发送的 Header,但实际期望看到的是提交的表单参数(如 feed_them_social=yes),而这些参数默认不会出现在 HTTP 头部中,而是以 application/x-www-form-urlencoded 格式编码后置于请求体(content)内。
你原代码的问题核心在于:
- ❌ 错误调用 exec('curl ...') 并传入 $context(这是一个资源句柄,非字符串),导致命令无效且无法传递真实数据;
- ❌ apache_request_headers() 只能读取 HTTP 请求头(如 Content-Type, User-Agent),无法直接获取 POST 表单内容;
- ✅ 正确路径应为:客户端用 file_get_contents() 发送结构化 POST 请求 → 服务端用 $_POST 或 file_get_contents('php://input') 解析请求体。
✅ 推荐修正方案(客户端):
$postdata = http_build_query([
'feed_them_social' => 'yes',
'refresh_token' => get_option('custom_refresh_token'),
'time' => esc_html(get_option('custom_token_exp_time')),
]);
$opts = [
'http' => [
'method' => 'POST',
'header' => "Content-type: application/x-www-form-urlencoded\r\n" .
"Content-Length: " . strlen($postdata) . "\r\n",
'content' => $postdata,
]
];
$context = stream_context_create($opts);
$response = file_get_contents('https://my-url.com', false, $context);
if ($response === false) {
throw new Exception('HTTP request failed: ' . error_get_last()['message']);
}
echo ''; print_r($response); echo '
';⚠️ 注意事项:
- Content-Length 必须显式设置(file_get_contents 不自动计算),否则部分服务器(如 Apache + mod_php)可能拒绝解析请求体;
- 确保目标 URL 的服务端脚本(如 https://my-url.com/receive.php)启用 $_POST 自动解析(需 Content-Type: application/x-www-form-urlencoded 且数据格式合法);
- 若需原始请求体(例如调试或处理非标准编码),服务端请使用:
$rawBody = file_get_contents('php://input'); // 获取未解析的 POST body parse_str($rawBody, $postData); // 手动解析为数组 print_r($postData);
? 总结:不要用 exec(curl) 拼接上下文;优先使用 file_get_contents() 配合 stream_context_create() 实现安全、可控的 HTTP 请求;服务端获取参数应依赖 $_POST(表单提交)或 php://input(原始体),而非误读请求头。
Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。
Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。
Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。
PixPix 是面向品牌、卖家和内容团队的在线 AI 图片视频创作平台,提供图视频 Agent、无限画布、图片生成、视频生成、自然语言编辑及商品套图、产品精修和带货视频等电商工具。
Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等
Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。













