這幾天在幫一些同學處理問題的時候,突然發現這些同學是使用file_get_contents()函數來採集頁面內容的,貌似都沒有curl的概念亦或是對這種工具特別不敏感,
本文我來給大家詳細介紹下cURL的簡單的使用方法,下文我將會給大家詳細介紹cURL的進階應用程式,
好,廢話不多說,我們先來認識下什麼是cURL,可能還有很多同學沒有聽說過這個工具,我先來給大家簡單介紹下什麼是cURL:
cURL可以使用URL的文法類比瀏覽器來傳輸資料,
因為它是類比瀏覽器,因此它同樣支援多種協議,
FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP等協議都可以很好的支援,包括一些:
HTTPS認證,HTTP POST方法,HTTP PUT方法,FTP上傳,keyberos認證,HTTP上傳,Proxy 伺服器,cookies,使用者名稱/密碼認證,
下載檔案斷點續傳,上傳檔案斷點續傳,httpProxy 伺服器管道,甚至它還支援IPv6,scoket5Proxy 伺服器,通過httpProxy 伺服器上傳檔案
到FTP伺服器等等。
這就是我們為什麼要使用cURL的原因。
使用cURL完成簡單的請求主要分為以下四步:
1.初始化,建立一個新cURL資源
2.設定URL和相應的選項
3.抓取URL並把它傳遞給瀏覽器
4.關閉cURL資源,並且釋放系統資源
我們來採集一個頁面,通常情況下,我們會使用file_get_contents()函數來擷取:
像這樣:
<?php $str = file_get_contents('http://bbs.lampbrother.net'); //或者是: $str = file("http://bbs.lampbrother.net"); //或者是: readfile("http://bbs.lampbrother.net"); ?>
這樣我們會發現,我們沒有辦法有效地進行錯誤處理,更重要的是我們沒有辦法完成一些高難度的任務:
如:處理cookies,驗證,表單提交,檔案上傳等等。
好,現在我們來用程式碼完成上述cURL的四步: <?php //1.初始化,建立一個新cURL資源 $ch = curl_init(); //2.設定URL和相應的選項 curl_setopt($ch, CURLOPT_URL, "http://www.lampbrother.net/"); curl_setopt($ch, CURLOPT_HEADER, 0); //3.抓取URL並把它傳遞給瀏覽器 curl_exec($ch); //4.關閉cURL資源,並且釋放系統資源 curl_close($ch); ?>
上述四步中,其中第二步最為關鍵,可以設定一些進階選項:
例如上例中的CURLOPT_URL和CURLOPT_HEADER,分別代表“需要擷取的URL地址”和“啟用時會將標頭檔的資訊作為資料流輸出”,這些只是冰山一角,我們還可以設定很多選項:
選項 |
可選value值 |
備忘 |
CURLOPT_AUTOREFERER |
當根據Location:重新導向時,自動化佈建header中的Referer:資訊。 |
|
CURLOPT_BINARYTRANSFER |
在啟用CURLOPT_RETURNTRANSFER的時候,返回原生的(Raw)輸出。 |
|
CURLOPT_COOKIESESSION |
啟用時curl會僅僅傳遞一個session cookie,忽略其他的cookie,預設狀況下cURL會將所有的cookie返回給服務端。session cookie是指那些用來判斷伺服器端的session是否有效而存在的cookie。 |
|
CURLOPT_CRLF |
啟用時將Unix的分行符號轉換成斷行符號分行符號。 |
|
CURLOPT_DNS_USE_GLOBAL_CACHE |
啟用時會啟用一個全域的DNS緩衝,此項為安全執行緒的,並且預設啟用。 |
|
CURLOPT_FAILONERROR |
顯示HTTP狀態代碼,預設行為是忽略編號小於等於400的HTTP資訊。 |
|
CURLOPT_FILETIME |
啟用時會嘗試修改遠程文檔中的資訊。結果資訊會通過curl_getinfo()函數的CURLINFO_FILETIME選項返回。 curl_getinfo(). |
|
CURLOPT_FOLLOWLOCATION |
啟用時會將伺服器伺服器返回的"Location: "放在header中遞迴的返回給伺服器,使用CURLOPT_MAXREDIRS可以限定遞迴返回的數量。 |
|
CURLOPT_FORBID_REUSE |
在完成互動以後強迫中斷連線,不能重用。 |
|
CURLOPT_FRESH_CONNECT |
強制擷取一個新的串連,替代緩衝中的串連。 |
|
CURLOPT_FTP_USE_EPRT |
啟用時當FTP下載時,使用EPRT (或 LPRT)命令。設定為FALSE時禁用EPRT和LPRT,使用PORT命令 only. |
|
CURLOPT_FTP_USE_EPSV |
啟用時,在FTP傳輸過程中回複到PASV模式前首先嘗試EPSV命令。設定為FALSE時禁用EPSV命令。 |
|
CURLOPT_FTPAPPEND |
啟用時追加寫入檔案而不是覆蓋它。 |
|
CURLOPT_FTPASCII |
CURLOPT_TRANSFERTEXT的別名。 |
|
CURLOPT_FTPLISTONLY |
啟用時只列出FTP目錄的名字。 |
|
CURLOPT_HEADER |
啟用時會將標頭檔的資訊作為資料流輸出。 |
|
CURLINFO_HEADER_OUT |
啟用時追蹤控制代碼的請求字串。 |
從 PHP 5.1.3 開始可用。CURLINFO_首碼是故意的(intentional)。 |
CURLOPT_HTTPGET |
啟用時會設定HTTP的method為GET,因為GET是預設是,所以只在被修改的情況下使用。 |
|
CURLOPT_HTTPPROXYTUNNEL |
啟用時會通過HTTP代理來傳輸。 |
|
CURLOPT_MUTE |
啟用時將cURL函數中所有修改過的參數恢複預設值。 |
|
CURLOPT_NETRC |
在串連建立以後,訪問~/.netrc檔案擷取使用者名稱和密碼資訊串連遠端站台。 |
|
CURLOPT_NOBODY |
啟用時將不對HTML中的BODY部分進行輸出。 |
|
CURLOPT_NOPROGRESS |
啟用時關閉curl傳輸的進度條,此項的預設設定為啟用。 Note: PHP自動地設定這個選項為 TRUE,這個選項僅僅應當在以調試為目的時被改變。 |
|
CURLOPT_NOSIGNAL |
啟用時忽略所有的curl傳遞給php進行的訊號。在SAPI多線程傳輸時此項被預設啟用。 |
cURL 7.10時被加入。 |
CURLOPT_POST |
啟用時會發送一個常規的POST請求,類型為:application/x-www-form-urlencoded,就像表單提交的一樣。 |
|
CURLOPT_PUT |
啟用時允許HTTP傳送檔案,必須同時設定CURLOPT_INFILE和CURLOPT_INFILESIZE。 |
|
CURLOPT_RETURNTRANSFER |
將curl_exec()擷取的資訊以檔案流的形式返回,而不是直接輸出。 |
|
CURLOPT_SSL_VERIFYPEER |
禁用後cURL將終止從服務端進行驗證。使用CURLOPT_CAINFO選項設定認證使用CURLOPT_CAPATH選項設定認證目錄 如果CURLOPT_SSL_VERIFYPEER(預設值為2)被啟用,CURLOPT_SSL_VERIFYHOST需要被設定成TRUE否則設定為FALSE。 |
自cURL 7.10開始預設為TRUE。從cURL 7.10開始預設綁定安裝。 |
CURLOPT_TRANSFERTEXT |
啟用後對FTP傳輸使用ASCII模式。對於LDAP,它檢索純文字資訊而非HTML。在Windows系統上,系統不會把STDOUT設定成binary模式。 |
|
CURLOPT_UNRESTRICTED_AUTH |
在使用CURLOPT_FOLLOWLOCATION產生的header中的多個locations中持續追加使用者名稱和密碼資訊,即使網域名稱已發生改變。 |
|
CURLOPT_UPLOAD |
啟用後允許檔案上傳。 |
|
CURLOPT_VERBOSE |