1 <?php 2 3 /** 4 * curl 模擬 GET 請求 5 * @param string $url 請求的URL 6 * @param bool|true $ssl 是否啓用 ssl證書驗證 7 * @param array $headers 設置 HTTP 頭字段的數組,格式: array('Content-type: text/plain', 'Content-length: 100') 8 * @return bool|mixed 9 * 10 */ 11 function _requestGet($url, $ssl=true, $headers=array()) 12 { 13 # curl完成初始化 14 $curl = curl_init(); 15 16 # curl 選項設置 17 curl_setopt($curl, CURLOPT_URL, $url); //須要獲取的URL地址 18 19 $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36'; 20 curl_setopt($curl, CURLOPT_USERAGENT, $user_agent); # 在HTTP請求中包含一個"User-Agent: "頭的字符串,聲明用什麼瀏覽器來打開目標網頁 21 22 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); # TRUE 時將會根據服務器返回 HTTP 頭中的 "Location: " 重定向。 23 24 curl_setopt($curl, CURLOPT_AUTOREFERER, true); # TRUE 時將根據 Location: 重定向時,自動設置 header 中的Referer:信息。 25 26 curl_setopt($curl, CURLOPT_TIMEOUT, 30); # 設置超時時間 27 28 curl_setopt($curl, CURLOPT_ENCODING, ''); 29 # HTTP請求頭中"Accept-Encoding: "的值。 這使得可以解碼響應的內容。 支持的編碼有"identity","deflate"和"gzip"。若是爲空字符串"",會發送全部支持的編碼類型 30 31 if($headers) { 32 curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); # 設置 HTTP 頭字段的數組。格式: array('Content-type: text/plain', 'Content-length: 100') 33 } 34 35 # SSL相關,https需開啓 36 if ($ssl) { 37 curl_setopt($curl, CURLOPT_CAINFO, '/cert/ca.crt'); # CA 證書地址 38 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); # 禁用後cURL將終止從服務端進行驗證 39 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); 40 # 設置爲 1 是檢查服務器SSL證書中是否存在一個公用名;設置成 2,會檢查公用名是否存在,而且是否與提供的主機名匹配;0 爲不檢查名稱。 在生產環境中,這個值應該是 2(默認值)。 41 # 公用名(Common Name)通常來說就是填寫你將要申請SSL證書的域名 (domain)或子域名(sub domain) 42 }else { 43 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); # 禁用後cURL將終止從服務端進行驗證,默認爲 true 44 } 45 46 curl_setopt($curl, CURLOPT_HEADER, false); # 是否處理響應頭,啓用時會將頭文件的信息做爲數據流輸出 47 48 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); # TRUE 將curl_exec()獲取的信息以字符串返回,而不是直接輸出。 49 50 # 執行 curl 會話 51 $response = curl_exec($curl); 52 53 if (false === $response) { 54 echo '<br>', curl_error($curl), '<br>'; 55 return false; 56 } 57 #關閉 curl會話 58 curl_close($curl); 59 return $response; 60 } 61 62 63 /** 64 * curl 模擬 POST 請求 65 * @param string $url 請求的URL 66 * @param array $data 請求數據 67 * @param bool|true $ssl 是否啓用 ssl證書驗證 68 * @param array $headers 設置 HTTP 頭字段的數組,格式: array('Content-type: text/plain', 'Content-length: 100') 69 * @return bool|mixed 70 * 71 */ 72 function _requestPost($url, $data, $ssl=true, $headers=array()) 73 { 74 # curl完成初始化 75 $curl = curl_init(); 76 77 # curl 選項設置 78 curl_setopt($curl, CURLOPT_URL, $url); //須要獲取的URL地址 79 80 $user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.110 Safari/537.36'; 81 curl_setopt($curl, CURLOPT_USERAGENT, $user_agent); # 在HTTP請求中包含一個"User-Agent: "頭的字符串,聲明用什麼瀏覽器來打開目標網頁 82 83 curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true); # TRUE 時將會根據服務器返回 HTTP 頭中的 "Location: " 重定向。 84 85 curl_setopt($curl, CURLOPT_AUTOREFERER, true); # TRUE 時將根據 Location: 重定向時,自動設置 header 中的Referer:信息。 86 87 curl_setopt($curl, CURLOPT_TIMEOUT, 30); # 設置超時時間 88 89 curl_setopt($curl, CURLOPT_ENCODING, ''); 90 # HTTP請求頭中"Accept-Encoding: "的值。 這使得可以解碼響應的內容。 支持的編碼有"identity","deflate"和"gzip"。若是爲空字符串"",會發送全部支持的編碼類型 91 92 if($headers) { 93 curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); # 設置 HTTP 頭字段的數組。格式: array('Content-type: text/plain', 'Content-length: 100') 94 } 95 96 # SSL相關,https需開啓 97 if ($ssl) { 98 curl_setopt($curl, CURLOPT_CAINFO, '/cert/ca.crt'); # CA 證書地址 99 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, true); # 禁用後cURL將終止從服務端進行驗證 100 curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, 2); 101 # 設置爲 1 是檢查服務器SSL證書中是否存在一個公用名;設置成 2,會檢查公用名是否存在,而且是否與提供的主機名匹配;0 爲不檢查名稱。 在生產環境中,這個值應該是 2(默認值)。 102 # 公用名(Common Name)通常來說就是填寫你將要申請SSL證書的域名 (domain)或子域名(sub domain) 103 }else { 104 curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); # 禁用後cURL將終止從服務端進行驗證,默認爲 true 105 } 106 107 108 curl_setopt($curl, CURLOPT_POST, true); # 是否爲POST請求 109 110 curl_setopt($curl, CURLOPT_POSTFIELDS, $data); # 處理請求數據,所有數據使用HTTP協議中的 "POST" 操做來發送 111 112 113 curl_setopt($curl, CURLOPT_HEADER, false); # 是否處理響應頭,啓用時會將頭文件的信息做爲數據流輸出 114 115 curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); # TRUE 將curl_exec()獲取的信息以字符串返回,而不是直接輸出。 116 117 # 執行 curl 會話 118 $response = curl_exec($curl); 119 120 if (false === $response) { 121 echo '<br>', curl_error($curl), '<br>'; 122 return false; 123 } 124 #關閉 curl會話 125 curl_close($curl); 126 return $response; 127 }