cURL 是一個利用URL語法規定來傳輸文件和數據的工具,支持很多協議,如HTTP、FTP、TELNET等,我們使用它來發送HTTP請求。它給我 們帶來的好處是可以通過靈活的選項設置不同的HTTP協議參數,並且支持HTTPS。本文將介紹cURL的一些特性,以及在PHP中如何運用它。
使用CURL的PHP擴展完成一個HTTP請求的發送一般有以下四個步驟:
1.初始化連接句柄curl_init();
2.設置CURL選項curl_setopt() ;
3.執行並獲取結果curl_exec();
4.釋放VURL連接句柄curl_close()。
curl實現GET
//初始化 $ch = curl_init(); //設置選項,包括URL curl_setopt($ch, CURLOPT_URL, "http://www.68xi.com"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_HEADER, 0); //執行並獲取HTML文檔內容 $output = curl_exec($ch); //釋放curl句柄 curl_close($ch); //打印獲得的數據 print_r($output);
上述代碼中使用到了四個函數 curl_init() 和 curl_close() 分別是初始化CURL連接和關閉CURL連接,都比較簡單。 curl_exec() 執行CURL請求,如果沒有錯誤發生,該函數的返回是對應URL返回的數據,以字符串表示滿意;如果發生錯誤,該函數返回 FALSE。需要注意的是,判斷輸出是否為FALSE用的是全等號,這是為了區分返回空串和出錯的情況。 CURL函數庫里最重要的函數是curl_setopt(),它可以通過設定CURL函數庫定義的選項來定制HTTP請求。上述代碼片段中使用了三個重要的選項: CURLOPT_URL 指定請求的URL; CURLOPT_RETURNTRANSFER 設置為1表示稍后執行的curl_exec函數的返回是URL的返回字符串,而不是把返回字符串定向到標准輸出並返回TRUE; CURLLOPT_HEADER設置為0表示不返回HTTP頭部信息。 CURL的選項還有很多,可以到PHP的官方網站(http://www.php.net/manual/en/function.curl-setopt.php)上查看CURL支持的所有選項列表。 curl實現POST
$url = "http://localhost/server.php";
$post_data = array ("username" => "bob","key" => "12345");
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// post數據
curl_setopt($ch, CURLOPT_POST, 1);
// post的變量
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
//打印獲得的數據
print_r($output);
PHP封裝好的curl請求類
<?php
class Curl
{
/**
* @brief get請求
* @param $url 請求的url
* @param array $param 請求的參數
* @param int $timeout 超時時間
* @param int $log 是否啟用日志
* @return mixed
*/
public static function get($url, $param=array(), $timeout=10, $log=1)
{
$ch = curl_init();
if (is_array($param)) {
$url = $url . '?' . http_build_query($param);
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); // 允許 cURL 函數執行的最長秒數
$data = curl_exec($ch);
if ($log) {
$data .= "\r\n";
$data .= self::logInfo($ch, $param, $data);
}
curl_close($ch);
return $data;
}
/**
* @brief post請求
* @param $url 請求的url地址
* @param array $param 請求的參數
* @param int $log 是否啟用日志
* @return mixed
*/
public static function post($url, $param=array(), $header=array(), $timeout=10, $log=1)
{
$ch = curl_init();
if (is_array($param)) {
$urlparam = http_build_query($param);
} else if (is_string($param)) { //json字符串
$urlparam = $param;
}
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); //設置超時時間
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //返回原生的(Raw)輸出
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
curl_setopt($ch, CURLOPT_POST, 1); //POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $urlparam); //post數據
if ($header) {
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
}
$data = curl_exec($ch);
if ($log) {
$data .= "\r\n";
$data .= self::logInfo($ch, $param, $data);
}
curl_close($ch);
return $data;
}
/**
* 請求信息記錄日志
* @param $ch curl句柄
* @param $request 請求參數
* @param $response 響應結果
*/
private static function logInfo($ch, $request, $response)
{
$info = curl_getinfo($ch);
$resultFormat = "耗時:[%s] 返回狀態:[%s] 請求的url[%s] 請求參數:[%s] 響應結果:[%s] 大小:[%s]kb 速度:[%s]kb/s";
$resultLogMsg = sprintf($resultFormat, $info['total_time'], $info['http_code'], $info['url'], var_export($request,true),var_export($response,true), $info['size_download']/1024, $info['speed_download']/1024);
return $resultLogMsg;
}
}
使用方法
// get請求
echo Curl::get('http://www.baidu.com');
// post請求
$arr = Curl::post('http://localhost:9090/test.php', ['a'=>1,'b'=>2]);
print_r($arr);
