PHP使用curl發送請求


   

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

  文章轉自:http://www.68xi.com/628.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM