使用PHP Curl提交JSON数据无响应是什么原因?
PHP CURL POST无返回问题排查方案
先给原有函数添加错误诊断逻辑,可直接定位具体故障原因,修改后的函数如下:
function postCurl($url, $data){ // 兼容直接传入JSON字符串的场景 if (!is_string($data) || !json_decode($data)) { $data = json_encode($data, JSON_UNESCAPED_UNICODE); // 检测JSON编码错误 if (json_last_error() !== JSON_ERROR_NONE) { return 'JSON编码错误:' . json_last_error_msg(); } } $ch = curl_init( $url); curl_setopt( $ch, CURLOPT_SSL_VERIFYHOST, 0 ); curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, 0 ); curl_setopt( $ch, CURLOPT_POST, 1 ); curl_setopt( $ch, CURLOPT_POSTFIELDS, $data); curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1 ); curl_setopt( $ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4 ); curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, 1 ); // 限制最多跟随3次重定向,避免循环重定向卡住 curl_setopt( $ch, CURLOPT_MAXREDIRS, 3); // 添加超时设置,避免网络异常长时间无返回 curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt( $ch, CURLOPT_TIMEOUT, 10); curl_setopt( $ch, CURLOPT_HTTPHEADER, array( 'Content-Type: application/json', 'Content-Length: ' . strlen($data), // 补充User-Agent,部分服务端会拦截无UA的请求 'User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36' )); $result = curl_exec( $ch ); // 捕获CURL执行错误 if(curl_errno($ch)){ $error = 'CURL错误:' . curl_error($ch); curl_close( $ch ); return $error; } // 获取HTTP状态码排查服务端异常 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close( $ch ); if ($httpCode != 200) { return '请求异常,HTTP状态码:' . $httpCode . ',返回内容:' . $result; } return $result; }
常见故障对应解决方式
- JSON编码错误:如果传入的数组包含非UTF-8编码的字符,
json_encode会返回false,提交空内容到服务端会导致解析失败无返回,上述代码已经增加了编码错误检测逻辑,会直接返回对应错误提示。 - 请求被服务端拦截:多数站点会校验请求头的User-Agent、Content-Length字段,缺失对应字段会直接拒绝请求,上述代码已经补全了必要请求头。
- 网络超时:原函数没有设置超时时间,网络不稳定或者目标站点响应慢会导致请求一直卡住无返回,上述代码设置了10秒的连接和请求超时限制。
- 无限重定向:原函数开启了跟随重定向但没有限制重定向次数,如果目标站点存在循环重定向会导致请求卡住,上述代码设置了最多3次重定向的限制。
- 服务端异常:如果服务端返回400参数错误、403权限拦截、500服务端错误等非200状态码,原函数可能返回空内容,上述代码会把状态码和返回内容一起返回方便定位问题。
调用修改后的函数测试,根据返回的错误信息针对性调整即可解决问题。
内容的提问来源于stack exchange,提问作者soliver
相关产品推荐
相关产品推荐

