PHP Curl返回http_code为0,但浏览器访问返回200的问题排查
解决PHP Curl返回http_code=0但浏览器访问正常的问题
首先,咱们先理清楚:http_code=0通常意味着Curl根本没建立起有效的HTTP连接——要么是请求本身有问题,要么是环境层面的限制。结合你的代码和场景,我给你几个排查和修复的方向:
1. 修复URL里的转义字符问题
你URL里用了&,这是HTML实体的转义符,但在PHP字符串里直接写的话,Curl会把它当作URL的一部分发送,导致服务器无法正确解析参数。把所有&替换成普通的&:
$url = 'http://www.myvaluefirst.com/smpp/sendsms?username=xxxxx&password=xxxx&to=xxxxx&text=Dear&from=STLTD'; curl_setopt($ch, CURLOPT_URL, $url);
这很可能是核心问题——浏览器会自动解析&为&,但Curl不会,所以服务器收到的参数是错的,直接拒绝了连接。
2. 移除CURLOPT_NOBODY选项
你设置了CURLOPT_NOBODY => true,这个选项会强制Curl发送HEAD请求(哪怕你设置了CURLOPT_HTTPGET => true也会被覆盖)。有些短信服务商的API可能不支持HEAD请求,直接返回空连接或者拒绝服务。把这行删掉:
// 删掉这行无效配置 // curl_setopt($ch, CURLOPT_NOBODY, true);
3. 增加错误排查代码
你现在的代码没有捕获Curl的错误信息,也没正确获取http_code,建议加上这些调试代码,方便精准定位问题:
$ch = curl_init(); $url = 'http://www.myvaluefirst.com/smpp/sendsms?username=xxxxx&password=xxxx&to=xxxxx&text=Dear&from=STLTD'; curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HEADER, true); curl_setopt($ch, CURLOPT_HTTPGET, true); curl_setopt($ch, CURLOPT_TIMEOUT, 100); $response = curl_exec($ch); // 检查Curl执行错误 if(curl_errno($ch)) { echo 'Curl错误信息: ' . curl_error($ch); } // 获取HTTP状态码 $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); echo 'HTTP状态码: ' . $httpCode; curl_close($ch);
通过curl_error()你能拿到具体的失败原因,比如连接超时、DNS解析失败、端口被拦截等等。
4. 环境层面的排查
如果上面的修复都没用,可能是服务器环境的问题:
- 检查服务器是否能ping通
www.myvaluefirst.com,或者用telnet www.myvaluefirst.com 80测试80端口是否开放 - 确认服务器的防火墙/SELinux没有阻止Curl发起外部请求
- 检查PHP的Curl扩展是否正常启用,有没有禁用HTTP协议的配置
按照这个顺序排查,应该能快速解决问题——大概率是URL转义或者CURLOPT_NOBODY的配置问题。
内容的提问来源于stack exchange,提问作者Gautam D
相关产品推荐
相关产品推荐

