无法读取PHP cURL结果:var_dump可用但无法赋值给变量
解决方案:特定服务器cURL无法获取JSON数据的排查步骤
1. 先排查cURL请求错误信息
首先必须添加cURL错误检测,这是定位问题的核心:
修改接收端代码,加入错误检查和请求信息打印:
<?php $ch = curl_init(); $curlConfig = array( CURLOPT_URL => 'http://binance99.unaux.com/index.php', CURLOPT_RETURNTRANSFER => true ); curl_setopt_array($ch, $curlConfig); $r = curl_exec($ch); // 打印cURL错误 if(curl_errno($ch)){ die('CURL错误:' . curl_error($ch)); } // 打印请求状态信息,重点看HTTP状态码 $info = curl_getinfo($ch); var_dump($info['http_code']); curl_close($ch); // 打印原始返回内容,确认是否为跳转页面 var_dump($r); ?>
如果HTTP状态码是301/302,说明远程服务器返回了重定向,此时需要让cURL跟随重定向。
2. 处理重定向问题
在curlConfig中添加跟随重定向的参数:
CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, // 限制最大重定向次数,防止死循环
3. 模拟浏览器请求头(绕过UA检测)
很多服务器会拒绝cURL默认的User-Agent,添加浏览器UA并明确请求JSON格式:
CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', CURLOPT_HTTPHEADER => array( 'Accept: application/json', 'Accept-Language: zh-CN,zh;q=0.9', ),
4. 处理SSL/HTTPS问题(如果使用HTTPS)
如果改用HTTPS后仍有问题,可临时关闭SSL验证(生产环境建议配置正确的CA证书):
CURLOPT_SSL_VERIFYPEER => false, CURLOPT_SSL_VERIFYHOST => false,
5. 优化内容编码处理
部分服务器会返回压缩内容,添加编码支持确保正常解析:
CURLOPT_ENCODING => 'gzip, deflate',
完整示例代码
整合上述参数后的接收端代码:
<?php $ch = curl_init(); $curlConfig = array( CURLOPT_URL => 'http://binance99.unaux.com/index.php', CURLOPT_RETURNTRANSFER => true, CURLOPT_FOLLOWLOCATION => true, CURLOPT_MAXREDIRS => 5, CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', CURLOPT_HTTPHEADER => array( 'Accept: application/json', 'Accept-Language: zh-CN,zh;q=0.9', ), CURLOPT_ENCODING => 'gzip, deflate', // 若使用HTTPS,取消以下两行注释 // CURLOPT_SSL_VERIFYPEER => false, // CURLOPT_SSL_VERIFYHOST => false, ); curl_setopt_array($ch, $curlConfig); $r = curl_exec($ch); if(curl_errno($ch)){ die('CURL错误:' . curl_error($ch)); } $info = curl_getinfo($ch); curl_close($ch); if($info['http_code'] === 200){ $data = json_decode($r, true); print_r($data); } else { echo '请求失败,状态码:' . $info['http_code']; var_dump($r); // 打印错误页面内容排查问题 } ?>
内容的提问来源于stack exchange,提问作者Paul
相关产品推荐
相关产品推荐

