首頁 >後端開發 >php教程 >PHP 中的 cURL 函式庫

PHP 中的 cURL 函式庫

不言
不言原創
2018-04-09 15:51:371855瀏覽

這篇文章要跟大家介紹的內容是PHP 中的cURL 函式庫,現在分享給大家,有需要的朋友可以參考一下

概述

簡介

##在設計之初,cURL (Client URL Library)是一種作為使用URL 語法傳輸資料的命令列工具。透過 cURL 函式庫,我們可以在 PHP 腳本中自由地使用某種協定來取得或提交數據,例如取得 HTTP 請求資料。簡單的來說,cURL 是客戶端向伺服器請求資源的工具。

PHP 支援 Daniel Stenberg 創建的 libcurl 函式庫,能夠連接通訊各種伺服器、使用各種協定。 libcurl 目前支援的協定有 http、https、ftp、gopher、telnet、dict、file、ldap。 libcurl 同時支援 HTTPS 憑證、HTTP POST、HTTP PUT、 FTP 上傳(也能透過 PHP 的 FTP 擴充完成)、HTTP 基於表單的上傳、代理、cookies、使用者名稱 密碼的認證。
優勢

在PHP 中,想要取得某個URL 的內容其實很簡單,有多種實作方法,例如使用

file_get_contents() 函數:

<?php
$content = file_get_contents("https://segmentfault.com");
var_dump($content);

雖然

file_get_contents() 函數使用起來很方便,但不夠靈活,也沒辦法進行錯誤處理。在一些複雜的請求中,不能夠設定請求頭、Cookie、代理、認證等相關信息,更不能向某個伺服器提交表單數據,上傳文件。

cURl 庫不僅支援豐富的網路協議,而且提供了設定各種 URL 請求參數的方法,功能強大。 cURL 的使用場景有很多,例如存取網頁資源,取得 WebService 介面資料、下載 FTP 伺服器檔案。

使用

基本步驟

要使用cURL 來傳送URL 請求,步驟大體分成以下四個步驟:

  1. 初始化cURL 會話;

  2. 設定請求選項;

  3. #執行cURL 會話;

  4. 關閉cURL 會話。

  5. // 1. 初始化 cURL 会话
    $ch = curl_init();
    
    // 2. 设置请求选项
    curl_setopt($ch, CURLOPT_URL, "https://segmentfault.com");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); # 获取的信息以字符串返回,而不是直接输出
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); # 禁止 cURL 验证对等证书,从而支持 HTTPS 访问
    
    // 3. 执行 cURL 会话
    $response = curl_exec($ch);
    var_dump($response);
    
    // 4. 关闭 cURL 会话
    curl_close($ch);
cURL 主要透過
curl_setopt() 函數設定請求選項,具體的每個選項說明請見http://php.net/manual/zh/ func...
錯誤處理

透過

curl_error() 函數可以查看cURL 會話錯誤詳情,而curl_getinfo() 函數可以查看回應資訊.因此,透過這兩個函數我們可以實作一個簡單的錯誤處理程序,例如我們現在存取一個不存在的URL 位址:

<?php

// 1. 初始化 cURL 会话
$ch = curl_init();

// 2. 设置请求选项
curl_setopt($ch, CURLOPT_URL, "https://segmentfault.com/test.php"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); # 获取的信息以字符串返回,而不是直接输出
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); # 禁止 cURL 验证对等证书,从而支持 HTTPS 访问

// 3. 执行 cURL 会话
$response = curl_exec($ch);

if ($response  === FALSE) {
    echo "cURL connert error: " . curl_error($ch);
    exit;
}

$info = curl_getinfo($ch);
if ($info[&#39;http_code&#39;] == 404) {
    echo &#39;HTTP 404&#39;;
    exit;
}

var_dump($response);

// 4. 关闭 cURL 会话
curl_close($ch);

實戰案例

1. POST 請求

使用cURL 模擬傳送POST 請求:

<?php
function curl_post($url, $data) {
    $ch = curl_init(); 

    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
        CURLOPT_POST => 1,           # 发送 POST 请求
        CURLOPT_POSTFIELDS => $data, # POST 请求数据 
    ]);

    $response = curl_exec($ch);
    
    curl_close($ch);
    
    return $response;
}

$url  = &#39;http://localhost/test.php&#39;;
$data = [&#39;id&#39; => 1, &#39;username&#39; => &#39;jochen&#39;];
echo curl_post($url, $data);

2. 檔案上傳

CURLOPT_POSTFIELDS:全部資料使用HTTP 協定中的"POST" 操作來傳送。 要傳送文件,在文件名稱前面加上@前綴並使用完整路徑。 檔案類型可在檔案名稱後以 ';type=mimetype' 的格式指定。 這個參數可以是 urlencoded 後的字串,類似'val1=1&val2=2&...',也可以使用一個以字段名為鍵值,字段資料為值的數組。
透過cURL 發送POST 請求來實現檔案上傳:

<?php
function curl_upload($url, $data) {
    $ch = curl_init(); 

    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
        CURLOPT_POST => 1,           # 发送 POST 请求
        CURLOPT_POSTFIELDS => $data, # POST 请求数据 
    ]);

    $response = curl_exec($ch);
    
    curl_close($ch);
    
    return $response;
}

$url  = &#39;http://localhost/test.php&#39;;
$data = [&#39;id&#39; => 1, &#39;file&#39; => &#39;@/root/image/boy.jpg&#39;];
echo curl_post($url, $data);

3. 檔案下載

其實,檔案下載與普通GET 請求是一樣的,只是檔案下載把返回內容保存至文件中,而不是簡單的輸出。配合

file_put_contents() 函數實作檔案下載:

56b62e99cd671c33a22cc122cd1dca25 $url,
        CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
    ]);

    $response = curl_exec($ch);
    
    curl_close($ch);
    
    return file_put_contents($path, $response);
}

curl_download('http://localhost/boy.jpg', './boy.jpg');
4. HTTP 認證

如果伺服器端需要驗證要求,設定

CURLOPT_USERPWD 參數即可:

<?php
function curl_auth($url, $user, $passwd) {
    $ch = curl_init();
    
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_USERPWD => "$user:$passwd", # 格式为:"[username]:[password]"
        CURLOPT_RETURNTRANSFER => 1
    ]);
    
    $result = curl_exec($ch);
    
    curl_close($ch);
    
    return $result;
}

echo curl_auth(&#39;http://localhost&#39;, &#39;jochen&#39;, &#39;password&#39;);

5. 模擬登入

這裡主要展示模擬登入使用了Cookie 來保持登入狀態的應用程式。首先我們需要透過帳號密碼登入取得Cookie 數據,然後利用已登入的Cookie 取得頁面資料:

<?php
// 模拟登录获取 Cookie
function curl_login($url, $data, $cookie) {
    $ch = curl_init(); 

    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_POST => 1,           # 发送 POST 请求
        CURLOPT_POSTFIELDS => $data, # POST 请求数据 
        CURLOPT_COOKIEJAR => $cookie # 将 cookie 信息保存至文件中
        CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
    ]);

    $response = curl_exec($ch);
    
    curl_close($ch);
    
    return $response;
}

// 获取页面数据
function curl_content($url, $cookie) {
    $ch = curl_init(); 
    
    curl_setopt_array($ch, [
        CURLOPT_URL => $url,
        CURLOPT_COOKIEFILE => $cookie # 加载包含 Cookie 数据的文件
        CURLOPT_RETURNTRANSFER => 1, # 获取的信息以字符串返回
    ]);

    $response = curl_exec($ch);
    
    curl_close($ch);
    
    return $response;
}

$post = [&#39;username&#39; => &#39;jochen&#39;, &#39;password&#39; => &#39;123456&#39;];
$cookie = &#39;./cookie.txt&#39;;
if (curl_login(&#39;http://localhost/login&#39;, $post,  $cookie)) {
    echo curl_content(&#39;http://localhost&#39;, $cookie);
}

cURL 封裝庫

PHP Curl Class 是一個寫得很好的cURL 封裝庫,它可以非常方便地發送HTTP 請求並與任何類型的Web API 整合。 PHP Curl Class 封裝庫適用於 PHP 5.3,5.4,5.5,5.6,7.0,7.1 和 HHVM。這個函式庫是眾所周知的,並提供了一個非常簡單的語法:

<?php
require __DIR__ . &#39;/vendor/autoload.php&#39;;

use \Curl\Curl;

$curl = new Curl();
$curl->get(&#39;https://www.example.com/&#39;);

if ($curl->error) {
    echo &#39;Error: &#39; . $curl->errorCode . &#39;: &#39; . $curl->errorMessage . "\n";
} else {
    echo &#39;Response:&#39; . "\n";
    var_dump($curl->response);
}

#參考文章:

  1. Client URL 函式庫

  2. php中的curl使用入門教程和常見用法實例

  3. 在PHP中使用CURL,“撩”伺服器只需幾行——php curl詳細解析和常見大坑

  4. Top 7: Best Curl Wrapper Libraries for PHP

#相關推薦:

PHP並發之用curl 並發減少後端存取時間

PHP透過CURL模擬登入並取得資料#

以上是PHP 中的 cURL 函式庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn