PHP中curl_getinfo()调用持续返回1问题求助
问题现象
PHP代码发起cURL POST请求时,请求实际执行成功,可正常看到预期响应内容,但调用curl_getinfo($ch, CURLINFO_HTTP_CODE)获取HTTP状态码时始终返回1,无法定位问题根源。
问题复现代码
$ch = curl_init($end_point); curl_setopt($ch, CURLOPT_POST,1); curl_setopt($ch, CURLOPT_POSTFIELDS, $request_body); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $result = curl_exec($ch); $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($http_status,"Code");
问题原因&修复方案
CURLINFO_HTTP_CODE返回1属于异常返回值,说明cURL没有完成标准HTTP响应状态行的解析,90%以上的同类问题都是缺失基础配置导致的,按以下顺序排查即可:
- 优先补全
CURLOPT_RETURNTRANSFER配置
该配置默认值为false,未手动开启时cURL会直接把响应内容输出到标准输出,不会把响应结果作为curl_exec()的返回值,且部分PHP版本的cURL扩展在该模式下不会正确解析、填充HTTP状态码字段,直接返回无意义的1值。
修复方式:在curl配置段添加如下代码:curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); - 增加cURL执行错误捕获
在curl_exec($ch)执行后立刻增加错误判断,排查是否存在协议解析、连接层面的隐性报错:if(curl_errno($ch)){ var_dump(curl_error($ch)); } - 检查请求地址格式
传入curl_init()的$end_point必须是带http://或https://前缀的完整合法URL,不能传入裸IP+端口、自定义协议前缀的地址,否则cURL不会按HTTP协议规则解析响应,会返回异常状态码。 - 检查干扰配置
排查是否误开了CURLOPT_CONNECT_ONLY(设为true时cURL建立连接后即终止执行,不会等待HTTP响应)、是否将CURLOPT_HTTP_VERSION设置为服务端不支持的HTTP版本,导致响应解析失败。
修复后完整参考代码
$ch = curl_init($end_point); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $request_body); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); // 补全关键配置 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // 可选配置:设置连接、请求超时避免程序假死 curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 30); $result = curl_exec($ch); // 捕获cURL层面执行错误 if (curl_errno($ch)) { $error = curl_error($ch); var_dump($error); } $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); var_dump($http_status, "Code"); // 释放cURL句柄 curl_close($ch);
内容的提问来源于stack exchange,提问作者Eldan Shkolnikov
相关产品推荐
相关产品推荐

