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);