1. 程式人生 > >PHP封裝一個通用的CURL類方法(設定、獲取請求頭響應頭並處理)

PHP封裝一個通用的CURL類方法(設定、獲取請求頭響應頭並處理)

通用的一個CURL類方法,設定請求頭、獲取響應頭等! 包括將格式處理成陣列格式,方便直接輸出

    /**
     * 傳送https post請求,也支援http請求,包括header請求
     * @param string $url 請求域名
     * @param string $data 傳送資料
     * @param array  $headers 請求頭資訊
     * @return string
     */
    static public function httpsRequestHeaders($url, $data = null, $headers = null)
    {

        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
        //設定post請求
        if (!empty($data)) {
            curl_setopt($curl, CURLOPT_POST, 1);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
        }
        //設定請求頭
        if(!empty($headers)){
            curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
        }
        //curl_setopt($curl, CURLOPT_TIMEOUT,60);
        //至關重要,CURLINFO_HEADER_OUT選項可以拿到請求頭資訊
        curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

        $arr = [];
        // 返回 response_header, 該選項非常重要,如果不為 true, 只會獲得響應的正文
        curl_setopt($curl, CURLOPT_HEADER, true);
        // 是否不需要響應的正文,為了節省頻寬及時間,在只需要響應頭的情況下可以不要正文
        //curl_setopt($curl, CURLOPT_NOBODY, true);
        $arr['request']      = curl_exec($curl);
        $request_header      = curl_getinfo($curl);     
        // 獲取請求頭    
        $request_header      = isset($request_header['request_header']) ? $request_header['request_header'] : '';   
        // 獲得響應結果裡的:頭大小
        $headerSize          = curl_getinfo($curl, CURLINFO_HEADER_SIZE);
        //響應碼
        $arr['http_code']     = curl_getinfo($curl,CURLINFO_HTTP_CODE);
        // 根據頭大小去獲取頭資訊內容(響應頭)
        $respon_header       = substr($arr['request'], 0, $headerSize);
        //獲取返回值
        $arr['request']     = substr($arr['request'], $headerSize);
        $responCutting       = explode("\n", $respon_header);
        $responHeader        = [];
       
        //將respon header 處理成陣列格式
        foreach ($responCutting as $k => $v) {
            //$v = 'Date: Mon, 20 Aug 2018 03:22:11 GMT';
            if($v != ''){
                $strpos  = strpos($v, ":");
                if(!empty($strpos) && empty(strpos("*".$v,"HTTP "))){
                    $startSubstr                  = substr($v, 0, $strpos);
                    $endSubstr                    = trim(substr($v, $strpos+1));
                    $responHeader[$startSubstr]   = $endSubstr;           
                }else{
                    
                    $strpos = strpos("**".$v, "HTTP");
                    if(!empty($strpos)){
                        $responHeader['Status Code'] = $v;
                    }
                }                
            }
        }

        //將request header 處理成陣列格式
        $requestCutting = explode("\n", $request_header);
        $requestHeader  = [];
        foreach ($requestCutting as $kk => $vv) {
            if($vv != ''){
                $strpos  = strpos($vv, ":");
                if(!empty($strpos) && empty(strpos("*".$vv,"HEAD ")) && empty(strpos("*".$vv,"HTTP"))){
                    $startSubstr                  = substr($vv, 0, $strpos);
                    $endSubstr                    = trim(substr($vv, $strpos+1));
                    $requestHeader[$startSubstr]  = $endSubstr;     
                }             
            }
        }

        $arr['respon_headers']   = $responHeader;
        $arr['request_headers']  = $requestHeader;
        curl_close($curl);
        
        return $arr;
    }