程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 詳解php的curl幾個函數,詳解phpcurl函數

詳解php的curl幾個函數,詳解phpcurl函數

編輯:關於PHP編程

詳解php的curl幾個函數,詳解phpcurl函數


  關於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.test.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\test\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過程中的錯誤。

    至此就結束了,有問題可以留言,有錯誤,望請指出,假如你指出我的錯誤,鄙人不勝感激,個人見識短淺,錯誤在所難免,群眾的眼睛才是雪亮的。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved