其實 curl 這個擴充套件本來也不打算寫得,畢竟這個也是大家最常用的功能之一的。不過既然是在刷文件,學習到了就分享出來吧,不要陷入「知識的詛咒」。本身自己的知識體系就不完整,說不定也有很多小夥伴和我一樣只是平常追求業務快速開發而簡單地使用,並沒有深入地去了解過。今天,我們就來深入地了解一下 curl 吧。
php 的這個 curl 擴充套件其實是基於的 libcurl 這個系統的擴充套件軟體。在 linux 相關的系統中,這個軟體基本就是標配的,像是 centos 、ubuntu 這些都是裝好系統就有的,不需要我們再單獨安裝這個 libcurl ,就算沒有的話,也可以方便地安裝到。
而對於 php 來說,這個擴充套件更是已經整合在了 php 的原始碼安裝包中,只需要我們在編譯安裝 php 的時候加上 --with-curl 就可以了。
先來看看最簡單地使用 curl 來請求乙個 get 位址。
$ch = curl_init("");
curl_setopt($ch, curlopt_returntransfer, 1);
curl_setopt($ch, curlopt_ssl_verifyhost, 1); // 檢查證書中是否設定網域名稱
curl_setopt($ch, curlopt_ssl_verifypeer, 0); // 信任任何證書
curl_close($ch);
標準的 curl 套路其實就是三步。curl_init() 開啟乙個控制代碼,控制代碼中包含 url 位址,curl_exec() 執行控制代碼輸出或返回結果,curl_close() 關閉控制代碼。為什麼說 curl_exec() 是輸出或者返回結果呢?因為如果在預設的情況下,curl_exec() 是會像 phpinfo() 這類函式一樣直接列印輸出結果的,我們需要使用 curl_setopt() 設定 curlopt_returntransfer 這個常量為 true 或 1 來讓 curl_exec() 將訪問結果作為返回值進行返回,而不是直接輸出。由此可以看出,curl_setopt() 也是 curl 中非常重要的乙個函式。其實它的作用就是為這個 curl 控制代碼設定各種配置引數,包括我們在**中看到的 curlopt_ssl_verifyhost 和 curlopt_ssl_verifypeer 就是為 https 鏈結的訪問而準備的配置引數,以及後面我們要看到的 post 請求也是需要使用 curl_setopt() 來實現的。
curl_exec() 返回的是訪問的 url 返回的結果,curl_getinfo() 返回的則是這個請求一些詳細資訊,比如我們可以看到請求的 url 位址、content-type 型別、http_code 等資訊,對於一些業務需求判斷來說,這些資訊非常重要。curl_error() 則是在本次請求中的錯誤資訊的顯示,如果產生了錯誤,錯誤資訊就可以通過這個函式獲取到。
get 請求是非常簡單的,當然,post 請求也不複雜,就像前面說的,只是配置引數有一些變化而已。
curlopt_postfields => ['a'=>'post測試'],
]);$res = curl_exec($ch);
$info = curl_getinfo($ch);
if(curl_error($ch))
var_dump($res);
// string(22) "測試資料post測試"
curl_close($ch);在這裡,我們用了乙個新的函式 curl_setopt_array() ,其實就是可以更加方便地使用陣列來定義配置引數而已,和乙個乙個地寫 curl_setopt() 沒有什麼區別,只是更加地方便。我們只需要指定 curlopt_post 為 true 或 1,然後通過 curlopt_postfields 為 post 引數賦值就可以了,是不是也非常簡單。
之前我們已經學習過一些編碼相關的函式,在 curl 擴充套件中,也有對應的 url 編碼函式,其實它和使用 urlencode() 並沒有什麼太大的區別。
$str = "測試編碼";
$escapestr = curl_escape($ch, $str);
var_dump($escapestr); // string(36) "%e6%b5%8b%e8%af%95%e7%bc%96%e7%a0%81"
var_dump(curl_unescape($ch, $escapestr)); // string(12) "測試編碼"
curl_close($ch);使用 curl_escape() 就可以對資料進行 url 編碼,使用 curl_unescape() 就可以非常方便地實現解碼。不過,這兩個函式是必須要乙個 curl 控制代碼引數的,也就是說,它們不能脫離 curl 來直接使用。我們日常開發還是使用 urlencode() 這類更為通用的函式就好了。
最後,我們再學習乙個非常簡單的函式,就是檢視一下當前系統的 curl 版本情況以及一些相關的軟體資訊,比如支援的協議列表之類的內容。
var_dump(curl_version());
// array(16)
// ["ares"]=>
// string(6) "1.15.0"
// ["ares_num"]=>
// int(69376)
// ["libidn"]=>
// string(5) "2.2.0"
// ["iconv_ver_num"]=>
// int(0)
// ["libssh_version"]=>
// string(13) "libssh2/1.9.0"
// ["brotli_ver_num"]=>
// int(16777223)
// ["brotli_version"]=>
// string(5) "1.0.7"
// }
就像文章開頭所說的,curl 的內容其實並不複雜,核心的就那幾步,它最複雜的部分是在於非常多的配置常量資訊,而且這些資訊並不是太好記,掌握常用的就可以了,後面我們還將繼續講解 curl 中其它的內容,不要錯過哦。
測試**:學習curl擴充套件功能的使用(一).php
學習CURL擴充套件功能的使用(二)
上回文章中我們已經學習了 curl 的基本操作,對於乙個能夠傳送 get 和 post 資料的遠端請求擴充套件來說,經常也會使用 curl 來進行爬蟲或是自動操作的一些專案的開發,在這其中,還有許多功能也是我們經常會使用到的,比如檔案上傳以及多個請求同時傳送。這個在筆者的實際工作開發中也都是做過的東...
CURL 使用學習
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!一 curl 轉義 url特殊字元需轉義 1 空格換成加號 2 正斜槓 分隔目錄和子目錄 3 問號 分隔url和查詢 4 百分號 制定特殊字元 5 號指定書籤 6 號分隔引數 轉義字元的原因 如果你的表單使用get方法提交,並且提交的引數中有 等特...
php7使用curl擴充套件
前言 最近專案中要呼叫第三方介面,看到網上很多都使用curl,但剛開始,php很多的知識都不是很熟悉。為了使用curl init 等函式,從安裝php的擴充套件curl開始踩了很多坑。對於環境安裝真的是比較頭疼的事情,往往可能因為一些小問題而不成功,而且按照網上亂七八糟的部落格說的做,真的一點用都沒...