一:curl 函數和參數詳解
函數庫:
1:curl_init 初始化一個curl會話
2:curl_close 關閉一個curl會話
3:curl_setopt 為一個curl設定會話參數
4:curl_error 返回一個包含當前會話錯誤資訊的字串
5:curl_exec 執行一個curl會話
6:curl_multi_add_handle 向curl批處理會話中添加單獨的curl控制代碼資源
7:curl_multi_close 關閉一個批處理控制代碼資源
8:curl_multi_exec 解析一個curl批處理控制代碼
9:curl_multi_getcontent 返回擷取的輸出的文字資料流
10:curl_multi_info_read 擷取當前解析的curl的相關傳輸資訊
11:curl_multi_init 初始化一個curl批處理控制代碼資源
12:curl_multi_remove_handle 移除curl批處理控制代碼資源中的某個控制代碼資源
13:curl_multi_select 阻塞直到cURL批處理串連中有活動串連
14:curl_setopt_array 以數組的形式為一個curl設定會話參數
15:curl_version 擷取curl相關的版本資訊
16:curl_getinfo 擷取一個curl串連資源控制代碼的資訊
17:curl_copy_handle 拷貝一個curl串連資源的所有內容和參數
18:curl_errno 返回一個包含當前會話錯誤資訊的數字編號
curl_setopt常用可設定參數:
CURLOPT_URL 請求的url地址
CURLOPT_RETURNTRANSFER 設定是否擷取資料返回,資料以檔案流的形式返回,不是直接輸出
CURLOPT_POST 設定是否POST請求,類型為:application/x-www-form-urlencoded,跟表單提交一樣
CURLOPT_POSTFIELDS POST請求的資料
CURLOPT_HEADER 啟用時會將標頭檔的資訊作為資料流輸出
CURLOPT_HTTPGET 啟用時會設定HTTP的method為GET,預設是GET
二:curl GET 方式
$ch = curl_init();
//設定選項參數
curl_setopt($ch, CURLOPT_URL, http://www.111cn.net);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//設定返回資料
curl_setopt($ch, CURLOPT_HEADER, 0);//設定頭部不執行
$output = curl_exec($ch);//執行
curl_close($ch);//釋放curl控制代碼
var_dump($output);
三:POST 方式
$url = "http://localhost/ceshi.php";
$post_data = array ("username" => "ceshi","pwd" => "sada&1dsw1","key"=>"ha");
$ch = curl_init();//初始化curl
curl_setopt($ch, CURLOPT_URL, $url);//佈建要求地址
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//傳回值
curl_setopt($ch, CURLOPT_POST, 1);//佈建要求方式POST
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);//請求所帶變數資料
$output = curl_exec($ch);//執行擷取返回資料,返回的資料建議json_encode($return_data);
curl_close($ch);
$output =json_decode($output );//解析返回資料
四:curl POST 方式上傳檔案
$post_data=array("Filedata"=>"@".$image_file);//利用數組傳值,image_file為圖片地址,@不能少,標明是一個檔案
$url = "http://localhost/ceshi.php";
$ch = curl_init(); //初始化curl
curl_setopt($ch, CURLOPT_URL, $url);//設定連結
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);//設定是否返回資訊
curl_setopt($ch, CURLOPT_POST, true);//設定為POST方式
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);//POST資料
$result = curl_exec($ch);//接收返回資訊
if(curl_errno($ch)){//出錯則顯示錯誤資訊
die(json_encode($ch));
}
curl_close($ch); //關閉curl連結
if (ord($result[0])==239&&ord($result[1])==187&&ord($result[2])== 191){
$result = substr( $result,3);//解決Bom頭帶來的json_decode為空白的bug,Bom頭是固定的,可以檢測後去除掉
}
$result=json_decode($result);
五:curl POST 檔案上傳常見問題和解決辦法:
1:curl_setopt設定CURLOPT_POSTFIELDS 傳值是個數組,後端一直無法擷取資料$_POST的值
錯誤現象:
如果$post_data是數組(包括多維陣列)的話會出現”entity is too large”的錯誤提示,接收資料的receive.php 無法擷取curl傳過來的資料
原因:
curl POST方法時候,傳遞一個數組到CURLOPT_POSTFIELDS,curl會把資料編碼成 multipart/form-data,如果傳遞一個URL-encoded字串時,資料會被編碼成 application/x-www-form-urlencoded,對於multipart/form-data的編碼方式其實相當於我們直接以”enctype=”multipart/form-data” method=”post” 這樣的表單進行操作
解決辦法:
a:
對$post_data 數組經 urlencode() 編碼後進行字串串連,
例:$post_data=”&name=urlencode($name)&pwd=usrlencode($pwd)”
b:
直接利用http_build_query()進行參數的拼接。
ps:
“multipart/form-data” 是把表單設定為MIME編碼,目的是用來傳輸二進位檔案的,若想上傳檔案,必須用這個編碼(例子見上面的curl POST上傳檔案的例子);但是普通的url資料使用的是“application/x-www-form-urlencoded” 格式。
2:curl請求返回資料頭部多了三個位元組,post請求後端是以json_encode 資料格式返回,進行json_decode後傳回值始終為空白
原因:bom頭搞的鬼,bom頭:在Windows下用記事本之類的程式將文字檔儲存為UTF-8格式時,記事本會在檔案頭前面加上幾個不可見的字元(EF BB BF),就是所謂的BOM(Byte order Mark),就是這前面多了三個位元組導致json_decode後傳回值為空白
對傳回值進行bom頭檢測檢測:
echo substr( $result, 0, 1 ); //看到一個亂碼
echo substr( $result, 0, 2 ); //看到兩個亂碼
echo substr( $result, 0, 3 ); //空白
echo substr( $result, 0, 4 ); //看到o
證明確實是bom頭的問題
解決辦法:
if ( ord( $result[0] ) == 239 && ord( $result[1] ) == 187&& ord( $result[2] ) == 191 ) {
$result = substr( $result, 3 );//Bom頭是固定的,可以檢測後去除掉
}