PHP 中 CURL 使用之 CURL 詳解!

www6662016com18288006666發表於2019-06-25

CURL是一個非常強大的開源庫,支援很多協議,包括HTTP、FTP、TELNET等,我們使用它來傳送HTTP請求。它給我 們帶來的好處是可以通過靈活的選項設定不同的HTTP協議引數,並且支援HTTPS。CURL可以根據URL字首是“HTTP” 還是“HTTPS”自動選擇是否加密傳送內容。

基本流程

使用CURL的PHP擴充套件完成一個HTTP請求的傳送一般有以下幾個步驟:

  1. curl_init():初始化
  2. curl_setopt():設定屬性。有一長串CURL 引數可供設定,它們能指定URL請求的各個細節
  3. curl_exec():執行並獲取結果
    4.curl_close() :釋放控制程式碼

下面的程式片段是使用CURL傳送HTTP的典型過程:

// 1. 初始化
$ch = curl_init();
// 2. 設定選項,包括URL
curl_setopt($ch,CURLOPT_URL,"https://www.mainblog.cn");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_HEADER,0);
// 3. 執行並獲取HTML文件內容
$output = curl_exec($ch);
if($output === FALSE ){
echo "CURL Error:".curl_error($ch);
}
// 4. 釋放curl控制程式碼
curl_close($ch);

curl_exec() 返回 true 或者 false ;判斷結果用全等號,這是為了區分返回空串和出錯的情況。

curl_setopt():設定 CURL 函式庫定義的選項來定製HTTP請求。上述程式碼片段中使用了三個重要的選項:

  • CURLOPT_URL:指定請求的 URL
  • CURLOPT_RETURNTRANSFER: 設定為1表示稍後執行的curl_exec函式的返回是URL的返回字串,而不是把返回字串定向到標準輸出並返回TRUE
  • CURLLOPT_HEADER:設定為0表示不返回HTTP頭部資訊

    CURL的選項還有很多,可以到PHP的官方網站上檢視CURL支援的所有選項列表

輸出資訊

在curl_exec()函式執行之後,可以使用curl_getinfo()函式獲取CURL請求輸出的相關資訊,示例程式碼如下:

curl_exec($ch);
$info = curl_getinfo($sh);
echo ' 獲取 ',$info['url'],' 耗時 ',$info['total_time'],'秒';

上述程式碼中curl_getinfo返回的是一個關聯陣列,包含以下資料:

key 內容 key 內容
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 重定向耗時

curl_getinfo()函式還有一個可選擇引數$opt,通過這個引數可以設定一些常量,對應到上術這個欄位,如果設定了第二個引數,那麼返回的只有指定的資訊。例如設定$opt為CURLINFO_TOTAL_TIME,則curl_getinfo()函式只返回total_time,即總傳輸消耗的時間,在只需要關注某些傳輸資訊時,設定$opt引數很有意義。

GET請求

如何使用CURL來傳送GET請求,傳送GET請求的關鍵是拼裝格式正確的URL。請求地址和GET資料由一個“?”分割,然後GET變數的名稱和值用“=”分隔,各個GET名稱和值由“&”連線。PHP為我們提供了一個函式專門用來拼裝GET請求和資料部分——http_build_query,該函式接受一個關聯陣列,返回由該關聯資料描述的GET請求字串。使用這個函式,結合CURL傳送HTTP請求的一般流程,我們封閉了一個傳送GET請求的函式——doCurlGetRequest,具體程式碼如下:

//初始化
$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);
//執行命令
$data = curl_exec($curl);
//關閉URL請求
curl_close($curl);
//顯示獲得的資料
print_r($data);

這個函式把使用http_build_query 拼裝好的帶GET引數的URL傳給curl_init函式,然後使用CURL傳送HTTP請求。

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);
  1. 上面程式碼中除了設定CURLOPT_POSTFIELDS外,我們還設定了CURL_POST為true,標識這個請求是一個POST請求
  2. 在POST請求中也是可以傳輸GET資料的,只需要在URL中拼裝GET請求資料

相關文章