CURL 是一個利用URL語法規定來傳輸檔案和資料的工具,支援很多協議,如HTTP、FTP、TELNET等,我們使用它來傳送HTTP請求。正因為這麼強大,當然PHP也支援 CURL 庫,前提是你的phpinfo中可以看到已經開啟curl擴充套件。它給我們帶來的好處是可以通過靈活的選項設定不同的HTTP協議引數,並且支援HTTPS,使用PHP的CURL 庫可以簡單和有效地去抓網頁,入庫等....CURL可以根據URL字首是'HTTP'還是'HTTPS'自動選擇是否加密傳送內容。
PHP使用curl傳送請求的過程
①初始化、curl_init();
②設定屬性、curl_setopt().有一長串CURL 引數可供設定,它們能指定URL請求的各個細節。
③執行並獲取結果、curl_exec();
④釋放控制程式碼、curl_close();
簡單程式碼舉例
<?php
//①初始化
$ch = curl_init();
//②設定選項,包括URL
curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
//③執行並獲取HTML文件內容
$output = curl_exec($ch);
if($output === FALSE ){
echo "CURL Error:".curl_error($ch);
}
//④釋放curl控制程式碼
curl_close($ch);
curl引數說明
curl_init() 和 curl_close() 分別是初始化CURL連線和關閉CURL連線,都比較簡單。
curl_exec() 執行CURL請求,如果沒有錯誤發生,該函式的返回是對應URL返回的資料,以字串表示滿意;如果發生錯誤,該函式返回 FALSE。需要注意的是,判斷輸出是否為FALSE用的是全等號,這是為了區分返回空串和出錯的情況。
CURL函式庫裡最重要的函式是curl_setopt(),它可以通過設定CURL函式庫定義的選項來定製HTTP請求。上述程式碼片段中使用了三個重要的選項:
CURLOPT_URL 指定請求的URL;
CURLOPT_RETURNTRANSFER 設定為1表示稍後執行的curl_exec函式的返回是URL的返回字串,而不是把返回字串定向到標準輸出並返回TRUE;
CURLLOPT_HEADER設定為0表示不返回HTTP頭部資訊。
獲取curl請求的詳細資訊
在curl_exec()函式執行之後,可以使用curl_getinfo()函式獲取CURL請求的詳細資訊,看程式碼:
curl_exec($ch);
$info = curl_getinfo($sh);
echo '輸出'.$info['url'].'耗時'.$info['total_time'].'秒';
$info = curl_getinfo,是一個關聯陣列,它包含了很多資料。詳細請看帖子http://www.runoob.com/php/func-curl_getinfo.html
PHP使用curl傳送GET和POST請求以及HTTPS協議處理
①、GET請求
//初始化
$curl = curl_init();
//設定抓取的url
//$data = [
// 'type' => '1',
// 'name' => 'test'
//];
curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com'.'?'.http_bulid_query($data));
//設定標頭檔案的資訊作為資料流輸出
curl_setopt($curl, CURLOPT_HEADER, 1);
//設定獲取的資訊以檔案流的形式返回,而不是直接輸出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//執行命令
$data = curl_exec($curl);
//關閉URL請求
curl_close($curl);
//顯示獲得的資料
print_r($data);
②、POST請求
//初始化
$curl = curl_init();
//設定抓取的url
curl_setopt($curl, CURLOPT_URL, 'http://www.baidu.com');
//設定標頭檔案的資訊作為資料流輸出
curl_setopt($curl, CURLOPT_HEADER, 1);
//設定獲取的資訊以檔案流的形式返回,而不是直接輸出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
//設定post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
//設定post資料
$post_data = array(
"username" => "coder",
"password" => "12345"
);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post_data);
//執行命令
$data = curl_exec($curl);
//關閉URL請求
curl_close($curl);
//顯示獲得的資料
print_r($data);
③、Json資料POST請求
<?php
$data='{"name":"筆記本","price":"1000元"}';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://jd.com/test.php");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 60); //設定一個最長的可忍受的連線時間,秒為單位
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json', 'Content-Length:' . strlen($data)));
curl_setopt($ch, CURLOPT_POSTFIELDS , $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($ch);
echo $output;
curl_close($ch);
?>
小案例
/** * 執行一個 HTTP 請求 * * @param string $Url 執行請求的Url * @param mixed $Params 表單引數 * @param string $Method 請求方法 post / get * @return array 結果陣列 */ public function request($Url, $Params, $Method='post'){ $Curl = curl_init();//初始化curl if ('get' == $Method){//以GET方式傳送請求 curl_setopt($Curl, CURLOPT_URL, "$Url?$Params"); }else{//以POST方式傳送請求 curl_setopt($Curl, CURLOPT_URL, $Url); curl_setopt($Curl, CURLOPT_POST, 1);//post提交方式 curl_setopt($Curl, CURLOPT_POSTFIELDS, $Params);//設定傳送的引數 } curl_setopt($Curl, CURLOPT_HEADER, false);//設定header curl_setopt($Curl, CURLOPT_RETURNTRANSFER, true);//要求結果為字串且輸出到螢幕上 curl_setopt($Curl, CURLOPT_CONNECTTIMEOUT, 3);//設定等待時間 $Res = curl_exec($Curl);//執行curl $Err = curl_error($Curl); if (false === $Res || !empty($Err)){ $Errno = curl_errno($Curl); $Info = curl_getinfo($Curl); curl_close($Curl); return array( 'result' => false, 'errno' => $Errno, 'msg' => $Err, 'info' => $Info, ); } curl_close($Curl);//關閉curl return array( 'result' => true, 'msg' => $Res, ); }