关于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;
    }

如果加班不能带来快乐,那就毫无意义....打卡下班!

posted @ 2022-11-15 20:35  芒果鱼  阅读(139)  评论(0编辑  收藏  举报