关于CURL 上线项目/线下测试 使用同一套代码,curl_getinfo()得到的结果却不相同
问题背景:
最近做项目有个需求就是:监听我们已经既有的站点网址。实时的得知其运行状态。以便于如果站点挂掉可以第一时间(邮件、短信)通知到负责人!
问题:
在实际功能实现时,发现一个细节上的问题。
就是功能 在线下测试的时候。通过 CURL 获得站点当前 站点 状态码没有问题。
但是功能上线时,就会有概率导致
某些站点 无法获得真实的状态码(多发生在 进行反向代理 ,多次重定向的站点)。
即使可以访问也会被返回 code 500 。
原因 :
一般情况下,这是由于所请求的URL路径(或API接口)需要所有请求的用户代理,
也就是USER-AGENT !
明白了这一点,我们只需要在CURL时候添加一个USER-AGENT值即可:
curl_setopt($ch, CURLOPT_USERAGENT, "User-Agent:Some-Agent / 1.0");
OK,其实我不喜欢废话的...
下面贴一下代码,可以供大家共同参考借鉴,或者指出不足以改进
相关代码示例
// 若发生重定向到https协议则跟进查看重定向地址状态码 function curl_https($url, $data=array(), $header=array(), $timeout=30){ $url = trim($url,"\0"); $ch = curl_init(); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2); // 从证书中检查SSL加密算法是否存在 curl_setopt($ch, CURLOPT_USERAGENT, "User-Agent:Some-Agent / 1.0"); //添加用户代理 curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HTTPHEADER, $header); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_exec($ch); if($error=curl_error($ch)){ return 500+rand(2,4); } $http_code = curl_getinfo($ch,CURLINFO_HTTP_CODE); curl_close($ch); return $http_code; } // 检查网站状态并返回状态码 function curl_200($url,$i=0){ $url = trim($url," "); $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_HEADER, 1); curl_setopt($curl,CURLOPT_NOBODY,true); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); $http_code = curl_getinfo($curl,CURLINFO_HTTP_CODE); curl_close($curl); $http_code = $http_code==0?404:$http_code; // 如果链接被重定向,则直接访问最终重定向地址状态码 if ($http_code==301) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE); curl_exec($ch); $redirectedUrl = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); $http_2 = curl_getinfo($ch); curl_close($ch); $http_code = $this->curl_https($redirectedUrl)*(-1); } return $http_code; }
如果加班不能带来快乐,那就毫无意义....打卡下班!