詳細瞭解下PHP的curl函式及常用之處

OldBoy~發表於2018-01-22

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,
        );

    }

 

 常用案例:看帖子吧http://www.php.cn/php-weizijiaocheng-359899.html

相關文章