關於php的curl一系列函數,這裡解釋一下它們的作用。
在html中,我們可以通過form設置http的post和get提交,但假如我們獲取的數據不是從html中來的,而是php腳本主動向其他服務器提交呢?這個時候,我們應該怎麼實現post和get提交數據呢?答案就是php的curl函數或者stream_context_create函數,還有fsockopen函數等等方式,這裡講一下curl的提交設置,其他兩種有時間會寫一下。
curl的函數實現http提交,關鍵就在四個函數:
一個是:curl_init()
作用:初始化curl的``套接流``
第二個是:curl_setopt()
作用:設置http提交參數
第三個是:curl_exec()
作用:執行curl ``套接流`` 的提交,並獲取服務器返回的內容
第四個:curl_close()
作用:關閉已經實現http提交目的的``套接流``
說是說四個函數,但實際的應用中,其實,就是設置curl_setopt這個函數的參數而已,其他三個都是跑龍套的,呵呵。
不相信,下面我們舉一個例子來利用curl系列函數實現http提交,不羅嗦了,直接上代碼:
<?php
/*
*創建一個curl_init提交函數,模擬get提交,模擬post提交,模擬json提交
*$url 提交的服務器地址,必須
*$data 提交的數據,必須,是關聯數組,
*$method 提交的方式,必須,默認get提交,選項值,只能填get、post、json
*$options 其他選項,可有可以無,如果設置了,不能設置CURLOPT_URL,必須符合curl_setopt_array()的參數語法
*如果失敗則返回false,提交數據成功,則返回服務器返回的結果
*/
function curl($url='',$data=array(),$method='get',$options=array()){
//驗證數據傳進來的數據是否合法
if(empty($url) || !filter_var($url,FILTER_VALIDATE_URL)){
return false;
}
if(!is_array($data) && empty($data)){
return false;
}
$method = strtolower($method);
if(!in_array($method,array('get','post','json'))){
return false;
}
//初始化curl句柄,
$ch = curl_init();
//設置服務器返回的數據不直接輸出,而是保留在curl_exec()的返回值中
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
if(!empty($options) && is_array($options)){
if(curl_setopt_array($ch,$options) == false){
return false;
}
}
switch($method){
case 'get':
//把要提交的數據轉換為get鍵值對提交
$data = http_build_query($data);
curl_setopt($ch,CURLOPT_URL,$url.'?'.$data);
//獲取curl執行後,服務器返回的結果
$return = curl_exec($ch);
curl_close($ch);
return $return;
break;
case 'post':
curl_setopt($ch,CURLOPT_URL,$url);
//設置post提交
curl_setopt($ch,CURLOPT_POST,true);
//提交post的數據
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$return = curl_exec($ch);
curl_close($ch);
return $return;
break;
case 'json':
//設置json提交的數據
$data = json_encode($data);
curl_setopt($ch,CURLOPT_URL,$url);
//設置post提交
curl_setopt($ch,CURLOPT_POST,true);
//json的數據通過post的方式提交
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
$return = curl_exec($ch);
curl_close($ch);
return $return;
break;
default:
return false;
break;
}
}
$url = "http://www.linuxidc.com/curl_setopt/upload.php";
//下面是測試,本人是測試成功了,我服務器是直接輸出$_POST,$_GET
$data = array( 'name' => 'Foo' );
$method ='post';
var_dump(curl($url,$data,$method));
注意::這裡::
json數據提交,服務器必須以php://input獲取,如file_get_contents('php://input');
bool curl_setopt_array ( resource $ch , array $options )的參數舉例:
設置curl套接流$ch相應的選項
$options = array(
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_HEADER => false
);
post和json,curl_setopt_array函數不能設置CURLOPT_POSTFIELDS,CURLOPT_POST這兩項
因為我這函數沒有排除,要排除,你可以自己修改這個函數
curl_setopt_array函數,其實也就是```批量```設置curl_setopt()函數的選項,
他們的作用是一樣的,我這裡利用它,是為了方便
post提交可以上傳文件,但是文件的地址必須這樣設置,下標為‘file’,地址前加@
array('file' => '@D:\vhost\linuxidc\curl_setopt\xingxing.jpg')
總結:
假如上面的函數你看不懂,那不要緊,下面我給你解釋一下,上面函數的主要意思:
利用curl套接流實現http提交的設置步驟:
首先:初始化curl
這對應上面的第一個步驟:
//初始化curl句柄,
$ch = curl_init();
其次:設置curl的參數,也就是設置http提交的參數,這對應上面的第二個步驟:
//把要提交的數據轉換為get鍵值對提交
$data = http_build_query($data);
curl_setopt($ch,CURLOPT_URL,$url.'?'.$data);
http_build_query()這個函數的作用不過是把一個關聯數組格式化成get方式提交的url鍵值對形式,這個你自己可以百度,這裡不詳說了。
這一步是curl設置套鏈接最關鍵的地方,你看下面的post提交和json提交就知道了:
curl_setopt($ch,CURLOPT_URL,$url);
//設置post提交
curl_setopt($ch,CURLOPT_POST,true);
//提交post的數據
curl_setopt($ch,CURLOPT_POSTFIELDS,$data);
看到沒有,設置post提交其實就是在curl_setopt函數中設置參數,
$ch 是curl_init初始化的套接流,curl_setopt函數就是不停的在這個$ch套接流中設置參數,
第一個參數:CURLOPT_URL,這是一個很關鍵的參數,它是設置要提交到哪裡的url
第二個參數:CURLOPT_POST,設置提交的方式Post
第三個參數:CURLOPT_POSTFIELDS,設置post的提交數據
其他參數,我這裡就不列舉了,假如你需要參考,可以鏈接這裡:http://www.php.net/manual/zh/function.curl-setopt.php
最後兩步:
一步是:curl_exec(),這個是執行curl套接流$ch
//設置服務器返回的數據不直接輸出,而是保留在curl_exec()的返回值中
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($ch);
這裡要說一下,你其實可以不設置CURLOPT_RETURNTRANSFER這個參數,假如你不設置,那麼,服務器返回值將會echo出來,而不是保存在上面的$return中
另一步是:
curl_close($ch);
這個是關閉執行完成的套接流,免得它占用內存資源
再給兩個函數:
curl_errno():
返回最後一次cURL操作的錯誤號。
curl_error():
返回一條最近一次cURL操作明確的文本的錯誤信息。
這兩個函數可以追蹤curl_init套接流的錯誤信息,可以根據它們來調整設置curl過程中的錯誤。
至此就結束了,有問題可以留言,有錯誤,望請指出,假如你指出我的錯誤,鄙人不勝感激,個人見識短淺,錯誤在所難免,群眾的眼睛才是雪亮的。