學習CURL擴展功能的使用(一)


學習CURL擴展功能的使用(一)

其實CURL 這個擴展本來也不打算寫得,畢竟這個也是大家最常用的功能之一的。不過既然是在刷文檔,學習到了就分享出來吧,不要陷入「知識的詛咒」。本身自己的知識體係就不完整,說不定也有很多小夥伴和我一樣只是平常追求業務快速開發而簡單地使用,並沒有深入地去了解過。今天,我們就來深入地了解一下CURL 吧。

PHP 的這個CURL 擴展其實是基於的libcurl 這個系統的擴展軟體。在linux 相關的系統中,這個軟體基本就是標配的,像是CentOS 、Ubuntu 這些都是裝好系統就有的,不需要我們再單獨安裝這個libcurl ,就算沒有的話,也可以方便地安裝到。

而對於PHP 來說,這個擴展更是已經集成在了PHP 的源碼安裝包中,只需要我們在編譯安裝PHP 的時候加上–with-curl 就可以了。

使用CURL 請求連結

先來看看最簡單地使用CURL 來請求一個GET 地址。

$ch = curl_init("https://www.baidu.com");curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 1); // 檢查證書中是否設置域名curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // 信任任何證書$res = curl_exec($ch);$info = curl_getinfo($ch);if(curl_error($ch)) {    var_dump(curl_error($ch));}var_dump($res);// string(14722) "// // //  //  //  //  //  //  //  //  //  //  //  百度一下,你就知道//  ……………………//  ……………………//  ……………………// // "var_dump($info);// array(37) {//     ["url"]=>//     string(21) "https://www.baidu.com"//     ["content_type"]=>//     string(9) "text/html"//     ["http_code"]=>//     int(200)//     ["header_size"]=>//     int(960)//     ["request_size"]=>//     int(52)//     ["filetime"]=>//     int(-1)//     ["ssl_verify_result"]=>//     int(0)//     ["redirect_count"]=>//     int(0)//     ["total_time"]=>//     float(0.127654)//     ["namelookup_time"]=>//     float(0.004669)//     ["connect_time"]=>//     float(0.030823)//     ["pretransfer_time"]=>//     float(0.100782)//     ["size_upload"]=>//     float(0)//     ["size_download"]=>//     float(14722)//     ["speed_download"]=>//     float(115921)//     ["speed_upload"]=>//     float(0)//     ["download_content_length"]=>//     float(14722)//     ["upload_content_length"]=>//     float(-1)//     ["starttransfer_time"]=>//     float(0.127519)//     ["redirect_time"]=>//     float(0)//     ["redirect_url"]=>//     string(0) ""//     ["primary_ip"]=>//     string(15) "183.232.231.172"//     ["certinfo"]=>//     array(0) {//     }//     ["primary_port"]=>//     int(443)//     ["local_ip"]=>//     string(13) "192.168.51.11"//     ["local_port"]=>//     int(52795)//     ["http_version"]=>//     int(2)//     ["protocol"]=>//     int(2)//     ["ssl_verifyresult"]=>//     int(0)//     ["scheme"]=>//     string(5) "HTTPS"//     ["appconnect_time_us"]=>//     int(100710)//     ["connect_time_us"]=>//     int(30823)//     ["namelookup_time_us"]=>//     int(4669)//     ["pretransfer_time_us"]=>//     int(100782)//     ["redirect_time_us"]=>//     int(0)//     ["starttransfer_time_us"]=>//     int(127519)//     ["total_time_us"]=>//     int(127654)//   }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() 則是在本次請求中的錯誤信息的顯示,如果產生了錯誤,錯誤信息就可以通過這個函數獲取到。

POST 請求

GET 請求是非常簡單的,當然,POST 請求也不複雜,就像前面說的,只是配置參數有一些變化而已。

$ch = curl_init("http://localhost:9001");curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt_array($ch, [    CURLOPT_POST => 1,    CURLOPT_POSTFIELDS => ['a'=>'post測試'],]);$res = curl_exec($ch);$info = curl_getinfo($ch);if(curl_error($ch)) {    var_dump(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 編碼

之前我們已經學習過一些編碼相關的函數,在CURL 擴展中,也有對應的URL 編碼函數,其實它和使用urlencode() 並沒有什麼太大的區別。

$ch = curl_init("http://localhost:9001");$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 的版本號

最後,我們再學習一個非常簡單的函數,就是查看一下當前系統的CURL 版本情況以及一些相關的軟體信息,比如支持的協議列表之類的內容。

var_dump(curl_version());// array(16) {//     ["version_number"]=>//     int(475648)//     ["age"]=>//     int(5)//     ["features"]=>//     int(11519901)//     ["ssl_version_number"]=>//     int(0)//     ["version"]=>//     string(6) "7.66.0"//     ["host"]=>//     string(25) "x86_64-apple-darwin19.5.0"//     ["ssl_version"]=>//     string(14) "OpenSSL/1.1.1d"//     ["libz_version"]=>//     string(6) "1.2.11"//     ["protocols"]=>//     array(23) {//       [0]=>//       string(4) "dict"//       [1]=>//       string(4) "file"//       [2]=>//       string(3) "ftp"//       [3]=>//       string(4) "ftps"//       [4]=>//       string(6) "gopher"//       [5]=>//       string(4) "http"//       [6]=>//       string(5) "https"//       [7]=>//       string(4) "imap"//       [8]=>//       string(5) "imaps"//       [9]=>//       string(4) "ldap"//       [10]=>//       string(5) "ldaps"//       [11]=>//       string(4) "pop3"//       [12]=>//       string(5) "pop3s"//       [13]=>//       string(4) "rtmp"//       [14]=>//       string(4) "rtsp"//       [15]=>//       string(3) "scp"//       [16]=>//       string(4) "sftp"//       [17]=>//       string(3) "smb"//       [18]=>//       string(4) "smbs"//       [19]=>//       string(4) "smtp"//       [20]=>//       string(5) "smtps"//       [21]=>//       string(6) "telnet"//       [22]=>//       string(4) "tftp"//     }//     ["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 中其它的內容,不要錯過哦。

測試代碼:https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/02/source/4.學習CURL擴展功能的使用(一).php

參考文檔:

https://www.php.net/manual/zh/ref.curl.php

推薦文章  設計師談小米12 系列後攝模組:點、線、面元素,未來將深化設計風格
Scroll to Top