在設計之初,cURL (Client URL Library)是一種做爲使用 URL 語法傳輸數據的命令行工具。經過 cURL 庫,咱們能夠在 PHP 腳本中自由地使用某種協議來獲取或者提交數據,好比獲取 HTTP 請求數據。簡單的來講,cURL 是客戶端向服務器請求資源的工具。php
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()
函數:html
<?php $content = file_get_contents("https://segmentfault.com"); var_dump($content);
雖然 file_get_contents()
函數使用起來很方便,可是不夠靈活,也無法進行錯誤處理。在一些複雜的請求中,不可以設置請求頭、Cookie、代理、認證等相關信息,更不能向某個服務器提交表單數據,上傳文件。git
cURl 庫不但支持豐富的網絡協議,並且提供了設置各類 URL 請求參數的方法,功能強大。cURL 的使用場景有不少,好比訪問網頁資源,獲取 WebService 接口數據、下載 FTP 服務器文件。github
要使用 cURL 來發送 URL 請求,步驟大致分爲如下四步:segmentfault
// 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['http_code'] == 404) { echo 'HTTP 404'; exit; } var_dump($response); // 4. 關閉 cURL 會話 curl_close($ch);
使用 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 = 'http://localhost/test.php'; $data = ['id' => 1, 'username' => 'jochen']; echo curl_post($url, $data);
CURLOPT_POSTFIELDS:所有數據使用 HTTP 協議中的 "POST" 操做來發送。 要發送文件,在文件名前面加上@前綴並使用完整路徑。 文件類型可在文件名後以 ';type=mimetype' 的格式指定。 這個參數能夠是 urlencoded 後的字符串,相似'val1=1&val2=2&...',也可使用一個以字段名爲鍵值,字段數據爲值的數組。
經過 cURL 發送 POST 請求來實現文件上傳:cookie
<?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 = 'http://localhost/test.php'; $data = ['id' => 1, 'file' => '@/root/image/boy.jpg']; echo curl_post($url, $data);
其實,文件下載與普通 GET 請求是同樣的,只是文件下載把返回內容保存至文件中,而不是簡單的輸出。配合 file_put_contents()
函數實現文件下載:網絡
<?php function curl_download($url, $path) { $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $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');
若是服務器端須要驗證請求,設置 CURLOPT_USERPWD
參數便可:app
<?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('http://localhost', 'jochen', 'password');
這裏主要展現模擬登陸使用了 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 = ['username' => 'jochen', 'password' => '123456']; $cookie = './cookie.txt'; if (curl_login('http://localhost/login', $post, $cookie)) { echo curl_content('http://localhost', $cookie); }
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__ . '/vendor/autoload.php'; use \Curl\Curl; $curl = new Curl(); $curl->get('https://www.example.com/'); if ($curl->error) { echo 'Error: ' . $curl->errorCode . ': ' . $curl->errorMessage . "\n"; } else { echo 'Response:' . "\n"; var_dump($curl->response); }
參考文章: