PHP Curl的簡單使用

本文寫給剛入PHP坑不久的新手們,作為工具文檔,方便用時查閱。

CURL是一個非常強大的開源庫,它支持很多種協議,例如,HTTP、HTTPS、FTP、TELENT等。日常開發中,我們經常會需要用到curl向其他系統api訪問。

使用

要想使用CURL,大致需要如下流程:

  1. 初始化CURL句柄
  2. 設置選項
  3. 執行並獲取結果
  4. 釋放CURL句柄

參見如下示例:

<code>$ch = curl_init();

curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);

$output = curl_exec($ch);
if($output === FALSE ){
echo "error:".curl_error($ch);
}

curl_close($ch);


echo $output;/<code>

在上面的代碼中,我們使用curl_init函數來初始化curl句柄,然後多次調用curl_setopt函數來設置多個選項,隨後我們調用curl_exec函數執行發送HTTP請求並從遠端接收相應數據,最終我們調用curl_close關閉curl句柄進行資源釋放。

運行這段代碼,我們可以看到控制檯下,會輸出百度的頁面信息。

對於選項部分:

  • CURLOPT_URL——設置請求的url及其使用的協議;
  • CURLOPT_RETURNTRANSFER——設置為1,表示返回的響應數據不會被從標準輸出輸出,而是作為返回值傳遞給output變量;否則,返回內容會被直接輸出到標準輸出,而返回值是錯誤號;

以上我們就完成了一個簡單的CURL使用。



下面我們看看如何設置GET和POST請求:

Get請求

其實我們上面的例子就是get請求,如果需要用到請求參數,可以直接在設置CURLOPT_URL選項時帶上請求參數。如下增加了一個hi參數,其值為hello:

<code>curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com?hi=hello");/<code>

Post請求

對於POST請求,我們對最開始的例子做一些修改即可,代碼如下:

<code>curl_setopt($ch,CURLOPT_URL,"http://127.0.0.1/");
curl_setopt($ch, CURLOPT_POSTFIELDS, 'hello=world');
curl_setopt($ch, CURLOPT_POST, true);/<code>

首先,我們將CURLOPT_URL選項的url改為本地環回地址的80端口。

其次,我們加入了CURLOPT_POSTFIELDS來設置post請求中參數字段。

最後,我們設置CURLOPT_POST選項為true,表示我們將發送一個POST類型請求。

curl_setopt函數的第二個參數種類非常多,可以參考php官方站點中curl_getinfo函數的opt參數內容,在需要時進行設置。

下面,我們在本地啟用nc來監聽80端口,這樣可以看到curl發來的請求,以驗證結果:

<code>curl_setopt函數的第二個參數種類非常多,可以參考php官方站點中curl_getinfo函數的opt參數內容,在需要時進行設置。$ nc -l 80
POST / HTTP/1.1
Host: 127.0.0.1
Accept: */*
Content-Length: 11
Content-Type: application/x-www-form-urlencoded

hello=world/<code>

可以看到,nc中收到php發來的請求是POST請求,且我們的post參數在請求體中,並且請求頭部也加入了content-相關字段指定數據大小和類型等。



下面,我們再來看看curl還能夠給我們哪些有用信息。

獲取請求響應的相關信息

利用curl_getinfo函數,我們可以獲取更多的與請求和響應相關的信息。只需要在curl_exec之後執行如下調用:

<code>$info = curl_getinfo($ch);/<code>

我們可以看下info都包含些什麼,以前面的例子為例,我們去掉最後的echo,然後在curl_exec後加入:

<code>$info = curl_getinfo($ch);
foreach ($info as $k => $v) {
echo $k.": ".$v."\\n";
}/<code>

輸出信息如下:

<code>url: http://www.baidu.com/      #網絡地址
content_type: text/html #響應數據類型
http_code: 200 #http響應碼
header_size: 750 #響應頭大小
request_size: 52 #請求大小
filetime: -1 #文件創建的時間
ssl_verify_result: 0 #SSL驗證結果
redirect_count: 0 #跳轉計數
total_time: 0.028716 #總耗時
namelookup_time: 0.004372 #DNS查詢耗時
connect_time: 0.019615 #等待連接耗時
pretransfer_time: 0.019732 #傳輸前準備耗時
size_upload: 0 #上傳數據大小

size_download: 14613 #下載數據大小
speed_download: 508880 #下載速度
speed_upload: 0 #上傳速度
download_content_length: 14613 #下載內容長度
upload_content_length: -1 #上傳內容長度
starttransfer_time: 0.027137 #直到首字節傳輸開始的耗時
redirect_time: 0 #重定向耗時
redirect_url: #重定向url
primary_ip: 119.75.216.20 #DNS解析後首選地址
certinfo: Array #TLS的證書鏈
primary_port: 80 #遠端端口
local_ip: 192.168.1.xxx #本地ip
local_port: 51210 #本地端口/<code>

這裡,碼哥對字段做了標註。可以看到,不僅可以獲取基本的響應信息,還可以獲取公網地址、網速、耗時等信息。


以上就是curl的簡單使用。


分享到:


相關文章: