PHP實戰之CURL從入門到實戰

1.前言

curl是利用URL語法在命令行方式下工作的開源文件傳輸工具,我們能夠通過CURL從互聯網上獲得各種各樣的網絡資源。下面我們一起學習一下。

2.使用前準備

打開php.ini

查詢curl模塊有沒有打開。

extension=php_curl.dll

3.CURL實戰

3.1抓取頁面

<?php

$ch = curl_init(); //初始化,創建一個新cURL資源
curl_setopt($ch, CURLOPT_URL, "http://www.baidu.com/");//設置URL和相應的選項
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_exec($ch); 
curl_close($ch); //關閉cURL資源,並且釋放系統資源

?>

3.2替換頁面信息

<?php

$curlobj = curl_init();// 初始化    
curl_setopt($curlobj, CURLOPT_URL, "http://www.baidu.com"); // 設置訪問網頁的URL
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, true); // 將curl_exec()獲取的信息以文件流的形式返回,而不是直接輸出。
$output=curl_exec($curlobj);   
curl_close($curlobj);       
echo str_replace("百度","php",$output);

?>

3.3調用WebService獲取天氣

<?php

header("Content-Type:text/html; charset=utf-8");
$data = 'theCityName=東莞';
$url = 'http://www.webxml.com.cn/WebServices/WeatherWebService.asmx/getWeatherbyCityName';
$headerArray = array("application/x-www-form-urlencoded;charset=utf-8", "Content-length: ".strlen($data));
$userAgent = "user-agent:Mozilla/5.0 (Windows NT 5.1; rv:24.0) Gecko/20100101 Firefox/24.0";
$curlobj = curl_init();
curl_setopt($curlobj,CURLOPT_URL, $url);
curl_setopt($curlobj, CURLOPT_USERAGENT, $userAgent);//僞造瀏覽器信息
curl_setopt($curlobj, CURLOPT_HEADER, 0);//啓用時會將頭文件的信息作爲數據流輸出。這裏不啓用
curl_setopt($curlobj, CURLOPT_RETURNTRANSFER, 1);//如果成功只將結果返回,不自動輸出任何內容。如果失敗返回FALSE
curl_setopt($curlobj, CURLOPT_POST, 1);//如果你想PHP去做一個正規的HTTP POST,設置這個選項爲一個非零值。這個POST是普通的 application/x-www-from-urlencoded 類型,多數被HTML表單使用。
curl_setopt($curlobj, CURLOPT_POSTFIELDS, $data);//需要POST的數據
curl_setopt($curlobj,CURLOPT_HTTPHEADER, $headerArray);
$rtn = curl_exec($curlobj);
if(!curl_errno($curlobj)){
    $info = curl_getinfo($curlobj);
    print_r($info);
} else {
    echo 'Curl error: ' . curl_error($curlobj);
}
curl_close($curlobj);

?>

其中curl_getinfo()函數獲取CURL請求輸出的相關信息,返回的是一個關聯數組,包含以下數據:

  • url:網絡地址。
  • content_type:內容編碼。
  • http_code:HTTP狀態碼。
  • header_size:header的大小。
  • request_size:請求的大小。
  • filetime:文件創建的時間。
  • ssl_verify_result:SSL驗證結果。
  • redirect_count:跳轉計數。
  • total_time:總耗時。
  • namelookup_time:DNS查詢耗時。
  • connect_time:等待連接耗時。
  • pretransfer_time:傳輸前準備耗時。
  • size_uplpad:上傳數據的大小。
  • size_download:下載數據的大小。
  • speed_download:下載速度。
  • speed_upload:上傳速度。
  • download_content_length:下載內容的長度。
  • upload_content_length:上傳內容的長度。
  • starttransfer_time:開始傳輸的時間表。
  • redirect_time:重定向耗時。

4.封裝CURL的API調用類

4.1get方法獲取接口數據

/**
 * 通過get方法獲取接口數據
 * @param $url
 * @return mixed
 */
public function getUrl($url)
{
    $headerArray = array("Content-type:application/json;", "Accept:application/json");
    $ch = curl_init();//   初始化一個cURL會話。
    curl_setopt($ch, CURLOPT_URL, $url);//需要獲取的URL地址,也可以在curl_init()函數中設置。
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);//禁用cURL後從服務端進行驗證。
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);//禁止檢查服務器SSL證書
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//將curl_exec()獲取的信息以文件流的形式返回,而不是直接輸出。
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);//設置HTTP頭字段的數組
    $output = curl_exec($ch);//    執行一個cURL會話
    curl_close($ch);
    $output = json_decode($output, true);
    return $output;
}

4.2 post方法獲取接口數據

/**
 * 通過post方法獲取接口數據
 * @param $url
 * @param $data
 * @return mixed
 */
public function postUrl($url, $data)
{
    $data = json_encode($data);
    $headerArray = array("Content-type:application/json;charset='utf-8'", "Accept:application/json");
    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
    curl_setopt($curl, CURLOPT_POST, 1);// 啓用時會發送一個常規的POST請求,類型爲:application/x-www-form-urlencoded,就像表單提交的一樣。
    curl_setopt($curl, CURLOPT_POSTFIELDS, $data);//全部數據使用HTTP協議中的"POST"操作來發送。
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headerArray);
    $output = curl_exec($curl);
    curl_close($curl);
    return json_decode($output, true);
}

4.3 put方法獲取接口數據

/**
 * 通過put方法獲取接口數據
 * @param $url
 * @param $data
 * @return mixed
 */
public function putUrl($url, $data)
{
    $data = json_encode($data);
    $headerArray = array('Content-type:application/json');
    $ch = curl_init(); //初始化CURL句柄
    curl_setopt($ch, CURLOPT_URL, $url); //設置請求的URL
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headerArray);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //設爲TRUE把curl_exec()結果轉化爲字串,而不是直接輸出
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); //設置請求方式
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);//設置提交的字符串
    $output = curl_exec($ch);
    curl_close($ch);
    return json_decode($output, true);
}

4.4 del方法獲取接口數據

/**
 * 通過del方法獲取接口數據
 * @param $url
 * @param $data
 * @return mixed
 */
public function delUrl($url, $data)
{
    $data = json_encode($data);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "DELETE");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $output = curl_exec($ch);
    curl_close($ch);
    $output = json_decode($output, true);
}

4.5 patch方法獲取接口數據

/**
 * 通過patch方法獲取接口數據
 * @param $url
 * @param $data
 * @return mixed
 */
public function patchUrl($url, $data)
{
    $data = json_encode($data);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type:application/json'));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PATCH");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $output = curl_exec($ch);
    curl_close($ch);
    $output = json_decode($output);
    return $output;
}

5.總結

通過上述學習回顧,我們對CURL有了基本的認識和掌握,能夠使用CURL抓取頁面、替換頁面信息、調用WebService獲取天氣以及封裝了CURL獲取API接口的調用類,其中包含get、post、put、del、patch等基本API方法,希望通過本次學習,加強對CURL的理解和以後的實踐應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章