CURL是一個(gè)非常強(qiáng)大的開源庫,它支持很多種協(xié)議,例如,HTTP、HTTPS、FTP、TELENT等。日常開發(fā)中,我們經(jīng)常會(huì)需要用到curl向其他系統(tǒng)api訪問。
使用
要想使用CURL,大致需要如下流程:
- 初始化CURL句柄
- 設(shè)置選項(xiàng)
- 執(zhí)行并獲取結(jié)果
- 釋放CURL句柄
參見如下示例:
<?php
$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;
在上面的代碼中,我們使用curl_init函數(shù)來初始化curl句柄,然后多次調(diào)用curl_setopt函數(shù)來設(shè)置多個(gè)選項(xiàng),隨后我們調(diào)用curl_exec函數(shù)執(zhí)行發(fā)送HTTP請(qǐng)求并從遠(yuǎn)端接收相應(yīng)數(shù)據(jù),最終我們調(diào)用curl_close關(guān)閉curl句柄進(jìn)行資源釋放。
運(yùn)行這段代碼,我們可以看到控制臺(tái)下,會(huì)輸出百度的頁面信息。
對(duì)于選項(xiàng)部分:
- CURLOPT_URL——設(shè)置請(qǐng)求的url及其使用的協(xié)議;
- CURLOPT_RETURNTRANSFER——設(shè)置為1,表示返回的響應(yīng)數(shù)據(jù)不會(huì)被從標(biāo)準(zhǔn)輸出輸出,而是作為返回值傳遞給output變量;否則,返回內(nèi)容會(huì)被直接輸出到標(biāo)準(zhǔn)輸出,而返回值是錯(cuò)誤號(hào);
以上我們就完成了一個(gè)簡(jiǎn)單的CURL使用。
下面我們看看如何設(shè)置GET和POST請(qǐng)求:
Get請(qǐng)求
其實(shí)我們上面的例子就是get請(qǐng)求,如果需要用到請(qǐng)求參數(shù),可以直接在設(shè)置CURLOPT_URL選項(xiàng)時(shí)帶上請(qǐng)求參數(shù)。如下增加了一個(gè)hi參數(shù),其值為hello:
curl_setopt($ch,CURLOPT_URL,"http://www.baidu.com?hi=hello");
Post請(qǐng)求
對(duì)于POST請(qǐng)求,我們對(duì)最開始的例子做一些修改即可,代碼如下:
curl_setopt($ch,CURLOPT_URL,"http://127.0.0.1/");
curl_setopt($ch, CURLOPT_POSTFIELDS, 'hello=world');
curl_setopt($ch, CURLOPT_POST, true);
首先,我們將CURLOPT_URL選項(xiàng)的url改為本地環(huán)回地址的80端口。
其次,我們加入了CURLOPT_POSTFIELDS來設(shè)置post請(qǐng)求中參數(shù)字段。
最后,我們?cè)O(shè)置CURLOPT_POST選項(xiàng)為true,表示我們將發(fā)送一個(gè)POST類型請(qǐng)求。
curl_setopt函數(shù)的第二個(gè)參數(shù)種類非常多,可以參考php官方站點(diǎn)中curl_getinfo函數(shù)的opt參數(shù)內(nèi)容,在需要時(shí)進(jìn)行設(shè)置。
下面,我們?cè)诒镜貑⒂胣c來監(jiān)聽80端口,這樣可以看到curl發(fā)來的請(qǐng)求,以驗(yàn)證結(jié)果:
curl_setopt函數(shù)的第二個(gè)參數(shù)種類非常多,可以參考php官方站點(diǎn)中curl_getinfo函數(shù)的opt參數(shù)內(nèi)容,在需要時(shí)進(jìn)行設(shè)置。$ 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
可以看到,nc中收到php發(fā)來的請(qǐng)求是POST請(qǐng)求,且我們的post參數(shù)在請(qǐng)求體中,并且請(qǐng)求頭部也加入了content-相關(guān)字段指定數(shù)據(jù)大小和類型等。
下面,我們?cè)賮砜纯碿url還能夠給我們哪些有用信息。
獲取請(qǐng)求響應(yīng)的相關(guān)信息
利用curl_getinfo函數(shù),我們可以獲取更多的與請(qǐng)求和響應(yīng)相關(guān)的信息。只需要在curl_exec之后執(zhí)行如下調(diào)用:
$info = curl_getinfo($ch);
我們可以看下info都包含些什么,以前面的例子為例,我們?nèi)サ糇詈蟮膃cho,然后在curl_exec后加入:
$info = curl_getinfo($ch);
foreach ($info as $k => $v) {
echo $k.": ".$v."n";
}
輸出信息如下:
url: http://www.baidu.com/ #網(wǎng)絡(luò)地址
content_type: text/html #響應(yīng)數(shù)據(jù)類型
http_code: 200 #http響應(yīng)碼
header_size: 750 #響應(yīng)頭大小
request_size: 52 #請(qǐng)求大小
filetime: -1 #文件創(chuàng)建的時(shí)間
ssl_verify_result: 0 #SSL驗(yàn)證結(jié)果
redirect_count: 0 #跳轉(zhuǎn)計(jì)數(shù)
total_time: 0.028716 #總耗時(shí)
namelookup_time: 0.004372 #DNS查詢耗時(shí)
connect_time: 0.019615 #等待連接耗時(shí)
pretransfer_time: 0.019732 #傳輸前準(zhǔn)備耗時(shí)
size_upload: 0 #上傳數(shù)據(jù)大小
size_download: 14613 #下載數(shù)據(jù)大小
speed_download: 508880 #下載速度
speed_upload: 0 #上傳速度
download_content_length: 14613 #下載內(nèi)容長(zhǎng)度
upload_content_length: -1 #上傳內(nèi)容長(zhǎng)度
starttransfer_time: 0.027137 #直到首字節(jié)傳輸開始的耗時(shí)
redirect_time: 0 #重定向耗時(shí)
redirect_url: #重定向url
primary_ip: 119.75.216.20 #DNS解析后首選地址
certinfo: Array #TLS的證書鏈
primary_port: 80 #遠(yuǎn)端端口
local_ip: 192.168.1.xxx #本地ip
local_port: 51210 #本地端口
這里,碼哥對(duì)字段做了標(biāo)注。可以看到,不僅可以獲取基本的響應(yīng)信息,還可以獲取公網(wǎng)地址、網(wǎng)速、耗時(shí)等信息。
以上就是curl的簡(jiǎn)單使用。