PHP CURL日志存储与POST数据转发故障排查及解决方案
问题分析与解决方案
核心问题
- 请求格式不兼容:服务器1通过CURL发送的是
application/json格式POST数据,但服务器2依赖$_REQUEST获取数据——$_REQUEST仅自动解析application/x-www-form-urlencoded或multipart/form-data类型的请求体,无法直接读取JSON格式的请求内容。 - 字段名称不匹配:服务器1提交的字段名是
field1/field2/field3,但服务器2中尝试获取的是field_1/field_2/field_3,两者完全不一致。
服务器2代码修改方案
修改服务器2代码,使其正确读取JSON请求体并修正字段名匹配问题:
<?php // 读取JSON格式的原始请求体 $rawInput = file_get_contents('php://input'); $requestData = json_decode($rawInput, true) ?: []; // 匹配服务器1的字段名,无需重复urlencode(JSON解析后会自动处理编码) $field_1 = $requestData['field1'] ?? ''; $field_2 = $requestData['field2'] ?? ''; $field_3 = $requestData['field3'] ?? ''; // Config $apikey = 'bla-bla'; $url = "https://api.some.url.dot.com/script"; // 准备转发给服务器3的数据 $postdata = array( "field_1" => $field_1, "field_2" => $field_2, "field_3" => $field_3 ); // 转发请求到服务器3 $data_string = json_encode($postdata); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string); curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'api-key:'.$apikey, 'Content-Type:application/json' )); $output = curl_exec($ch); // 写入日志 $log = $field_1.' '.$field_2.' '.$field_3; file_put_contents('/path/to/log',$log.PHP_EOL , FILE_APPEND | LOCK_EX); // 可选:返回响应便于调试 echo $output; die(); ?>
额外优化建议
- 服务器1的CURL代码中,
$_POST[field1]存在语法错误,应改为$_POST['field1'](添加引号,避免PHP将其解析为常量)。 - 服务器1无需对字段值做
urlencode,JSON会自动处理字符串转义,重复编码会导致服务器2解析后出现多余编码字符。修改后服务器1的$args可简化为:
$args = array( 'field1' => $_POST['field1'], 'field2' => $_POST['field2'], 'field3' => $_POST['field3'], );
内容的提问来源于stack exchange,提问作者lion
相关产品推荐
相关产品推荐

