本篇文章給大家介紹的內容是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 請求,步驟大體分為以下四步:
初始化 cURL 會話;
佈建要求選項;
執行 cURL 會話;
關閉 cURL 會話。
// 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);
實戰案例
1. POST 請求
使用 cURL 類比發送 POST 請求:
<?phpfunction 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);
2. 檔案上傳
CURLOPT_POSTFIELDS:全部資料使用 HTTP 協議中的 "POST" 操作來發送。 要傳送檔案,在檔案名稱前面加上@首碼並使用完整路徑。 檔案類型可在檔案名稱後以 ';type=mimetype' 的格式指定。 這個參數可以是 urlencoded 後的字串,類似'val1=1&val2=2&...',也可以使用一個以欄位名為索引值,欄位資料為值的數組。
通過 cURL 發送 POST 請求來實現檔案上傳:
<?phpfunction 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);
3. 檔案下載
其實,檔案下載與普通 GET 請求是一樣的,只是檔案下載把返回內容儲存至檔案中,而不是簡單的輸出。配合 file_put_contents() 函數實現檔案下載:
<?phpfunction 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');
4. HTTP 認證
如果伺服器端需要驗證請求,設定 CURLOPT_USERPWD 參數即可:
<?phpfunction 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');
5. 類比登入
這裡主要展示類比登入使用了 Cookie 來保持登入狀態的應用。首先我們需要通過帳號密碼登入擷取到 Cookie 資料,然後利用已登入的 Cookie 擷取頁面資料:
<?php// 類比登入擷取 Cookiefunction 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);}
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。這個庫是眾所周知的,並提供了一個非常簡單的文法:
<?phprequire __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);}
參考文章:
Client URL 庫
php中的curl使用入門教程和常見用法執行個體
在PHP中使用CURL,“撩”伺服器只需幾行——php curl詳細解析和常見大坑
Top 7: Best Curl Wrapper Libraries for PHP
相關推薦:
PHP並發之用curl 並發減少後端訪問時間
PHP通過CURL類比登入並擷取資料