cURL是php中一個很強大的功能,可以模仿各種用戶請求,如模仿用戶登錄,發送php cookie等等操作,下面我來整理一些相關的方法與各位同學看看
備注:使用curl_init函數,必須要打開這個php擴展。
1.打開php.ini,開啟extension=php_curl.dll
2.檢查php.ini的extension_dir值是哪個目錄,檢查有無php_curl.dll,沒有的請下載php_curl.dll,再把php目錄中的libeay32.dll,ssleay32.dll拷到c:/windows/system32裡面。
最近在學習騰訊開放平台API接口的過程中,看到了一個很強大的PHP庫——cURL。它是利用URL語法在命令行方式下工作的文件傳輸工具。這篇文章是博主直接從國外一個博客翻譯過來的,原文地址是:http://codular.com/curl-with-php。這篇文章講的很基礎,但條理很清晰,知識比較系統和全面,所以轉過來收藏了!(下面的有些標題是博主畫蛇添足的,大家近乎可以忽略。)
1 定義:什麼是cURL
cURL允許數據傳輸跨廣泛的協議,是一個非常強大的系統。它廣泛用於跨網站發送數據,包括諸如API交互和oAuth。cURL是在它的應用范圍內幾乎是無所不能的,從基本的HTTP請求,到更為復雜的FTP上傳或封閉式HTTPS網站的交互驗證。讓我們一起來看看發送一個GET和POST請求和處理返回的響應的簡單區別,以及一些重要的參數說明。
在我們通過一個cURL請求做任何事之前,我們首先需要初始化一個cURL的實例。我們可以通過調用函數curl_init()函數實現,它會返回一個cURL資源。該函數接收你想要發送的請求URL作為它的一個參數。在本文中,我們先不做這一步,可以在接下來的過程中用另一種方式來實現它。
2 須知:一些核心設置
一旦我們得到了一個cURL資源,我們可以開始進行一些配置,下面列出我總結的一些核心設置。
CURLOPT_RETURNTRANSFER - 返回響應作為一個字符串,而不是輸出到屏幕
CURLOPT_CONNECTTIMEOUT - 連接超時的時間
CURLOPT_TIMEOUT - cURL執行的超時時間
CURLOPT_USERAGENT - 用於請求的Useragent字符串
CURLOPT_URL - 發送請求的URL對象
CURLOPT_POST - 以POST方式發送一個請求
CURLOPT_POSTFIELDS - 在POST提交的請求中的數組數據
3 創建一個配置
我們可以通過使用curl_setopt()方式創建一個配置,這個方式接受3個參數:cURL資源、設置以及設置對應的值。因此,我們可以如下所示設置我們正在發送的請求URL。
代碼如下 復制代碼 $curl = curl_init();
curl_setopt($curl, CURLOPT_URL, 'http://www.bKjia.c0m');
如上所示,當獲取cURL資源時,我們可以通過傳送一個參數來設置URL。
代碼如下 復制代碼$curl = curl_init('http://www.hzhuti.com');
當然我們也可以通過給curl_setopt_array()函數傳遞一個包含變量名和變量值的數組一次性地創建多重配置。
代碼如下 復制代碼 $curl = curl_init();
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'http://www.bKjia.c0m'
));
4 執行請求:curl_exec()
當所有選項都配置好後,准備發送請求時,我們可以通過調用curl_exec()方式來執行這個cURL請求。這個函數將會返回三種不同的情形:
代碼如下 復制代碼$result = curl_exec($curl);
此時,$result已經包含了頁面的響應——它可能是JSON,一個字符串或者一個完整的網站的HTML。
5 關閉請求:curl_close()
當你發送完一個請求並且獲取到了相應的返回結果,你就需要關閉這個cURL請求以便釋放一些系統資源。通過調用curl_close()方法,我們可以像其它所有需要將資源作為參數的函數一樣簡單實現資源的釋放。
6 GET請求
GET請求是默認的請求方法,並且我們可以很直截了當的使用它。事實上所有的例子到目前為止一直都是GET請求。如果你想在請求中加入傳入一些參數,那麼你可以像http://testcURL.com/?item1=value&item2=value2一樣把這些參數作為一個查詢字符串附加在URL地址後面。
因此,我們可以通過如下示例發送一個GET請求到上面的URL中去,並且返回相應的結果。
代碼如下 復制代碼 // Get cURL resource
$curl = curl_init();
// Set some options - we are passing in a useragent too here
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'http://testcURL.com/?item1=value&item2=value2',
CURLOPT_USERAGENT => 'Codular Sample cURL Request'
));
// Send the request & save response to $resp
$resp = curl_exec($curl);
// Close request to clear up some resources
curl_close($curl);
7 POST請求
GET請求和POST請求兩者之間語法的唯一區別就是:在你想要傳送一些數據時,多了一個設置。我們將把CURLOPT_POST設置為true,並且通過設置CURLOPT_POSTFIELDS來傳送包含一個數組的數據。
因此,如果把上面的GET請求轉換為POST請求,我們可以使用下面的代碼:
代碼如下 復制代碼 // Get cURL resource
$curl = curl_init();
// Set some options - we are passing in a useragent too here
curl_setopt_array($curl, array(
CURLOPT_RETURNTRANSFER => 1,
CURLOPT_URL => 'http://www.bKjia.c0m',
CURLOPT_USERAGENT => 'Codular Sample cURL Request',
CURLOPT_POST => 1,
CURLOPT_POSTFIELDS => array(
item1 => 'value',
item2 => 'value2'
)
));
// Send the request & save response to $resp
$resp = curl_exec($curl);
// Close request to clear up some resources
curl_close($curl);
到這裡,你就擁有了這樣的一個POST請求:它將產生和上面GET請求一樣的效果,並且把返回數據到腳本中,這樣你就可以隨便使用它們了。
發起https請求示例
代碼如下 復制代碼function _https_curl_post($url, $vars)
{
foreach($vars as $key=>$value)
{
$fields_string .= $key.'='.$value.'&' ;
}
$fields_string = substr($fields_string,0,(strlen($fields_string)-1)) ;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // this line makes it work under https
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_POST, count($vars) );
curl_setopt($ch, CURLOPT_POSTFIELDS, $fields_string);
$data = curl_exec($ch);
curl_close($ch);
if ($data)
{
return $data;
}
else
{
return false;
}
}
8 錯誤
盡管我們討厭錯誤,但是你還是得注意使用cURL時可能出現的情形。因為你最終無法控制你所發送請求的網站,也無法保證該站點的響應結果將會是你預想的那種方式以及這個站點一直都會是正常狀態。
這裡提供了兩個可以用來處理錯誤的函數:
curl_error() - 返回一個字符串錯誤信息(當請求正常返回時,其值為空)
curl_errno() - 返回cURL的錯誤數目,然後你可以查看這個包含錯誤代碼的頁面。
例如,你可以如下示例使用:
代碼如下 復制代碼 if(!curl_exec($curl)){
die('Error: "' . curl_error($curl) . '" - Code: ' . curl_errno($curl));
}
如果你想要任何HTTP響應代碼都大於400來產生一個錯誤,而不是返回整個HTML頁面,那麼你可以把CURLOPT_FAILONERROR設置為true。cURL是一個“龐然大物”,並且還有很多很多的可能。有些網站可能為一些用戶代理提供服務頁面,當使用API接口時,它們可能會要求你傳送一個特別的用戶代理,這些都是我們需要注意的。如果你還想了解一些cURL請求,為何不嘗試去oAuth with Instagram看看呢?