天天看點

php中的curl使用入門教程和常見用法執行個體

起先curl是做為一種指令行工具設計出來的,比較幸運的是,php也支援curl了。通過curl這個利器,我們能在php程式中自由地發送

http請求到某個url來擷取或者送出資料,并且支援其它多種協定,比如ftp,telnet以及smtp等。在這篇博文中,我将簡述下,在php中具

體怎麼使用curl來處理一些事情。

你也許會說,在php中可以很容易的擷取某個url的内容,隻要通過file_get_contents,file或者readfile函數就能輕松實作,根本不必使用curl:

沒錯,以上函數在某些情況下使用起來确實很友善,但是我感覺這幾個函數不夠靈活,也沒法進行錯誤處理。而且,如果遇到要在php程式中向某個伺服器

送出表單資料,上傳檔案,處理cookies或者認證等任務時,以上三個函數根本無法勝任。這個時候,curl就展現它的價值了。

curl不但支援很多的網絡協定,而且提供了關于url請求的具體資訊,很強大!

要使用curl來發送url請求,具體步驟大體分為以下四步:

1.初始化

2.設定請求選項

3.執行一個curl會話并且擷取相關回複

4.釋放curl句柄,關閉一個curl會話

在上述代碼中,你也可以增加錯誤處理的代碼:

注意了,在做上述判斷時務必要使用<code>===</code>,因為請求的回複可能是空字元串,curl在請求出錯的情況下回傳回false值,是以我們必須使用<code>===</code>,而不是<code>==</code>。

在執行一個curl請求後,你也可以使用curl_getinfo擷取該請求的具體資訊:

上述$curl_info是一個關聯數組,可以從中擷取很多的具體請求資訊。參考http://cn2.php.net/manual/zh/function.curl-getinfo.php

我們在前面說過,在向某個url發送get請求的話,沒有必要使用curl來發送get請求,可以使用比較便捷的<code>file_get_contents</code>函數來完成請求。但是,一般地,我們在送出某個表單的時候,資料是通過post請求的内容區域來送出的,而不是通過url參數來傳遞的, 這種情況下,我們應該使用靈活的curl來模拟發送post請求。

現在,讓我們使用curl來模拟發送一個post請求到post.php腳本,送出幾個資料到post.php,然後在post.php中輸出post請求中的資料。示例代碼如下:

以上請求發送到post.php中後,通過print_r($_post)輸出後,以上示例代碼會輸出如下回複:

正如我們看到的,curl成功發送post請求到post.php,送出了一些資料,并且收到了相應的來自post.php的回複,最後輸出回複。上例雖然簡單,但是充分示範了curl發送post請求的便捷及強大之處,你可以在curl_setopt上做文章。

下面來看下如果通過curl發送post請求來實作檔案上傳。就拿深入淺出php下的檔案上傳中的檔案上傳例子來示範,在深入淺出php下的檔案上傳中,是通過表單的送出來實作檔案上傳的,那麼通過curl怎麼來實作呢?

通過以上示例代碼,可以将我本地機器上的boy.jpg上傳到本地伺服器的upload.php中,如果在upload.php輸出上傳的具體資訊的話,以上示例代碼最後的輸出的回複為:

上述将了檔案上傳,同樣的也可以使用curl來自動地完成檔案的下載下傳以及儲存。有一點要補充下,在執行一個curl請求時,如果你需要擷取傳回的内容,而不是直接輸出傳回的内容的話,别忘記使用下面的代碼設定,因為curl的預設是輸出請求的回複内容:

假如在52fhy的伺服器根目錄下面有一個test.zip檔案,我們需要将其下載下傳下來,并且儲存到本地檔案中,就可以嘗試使用下面的代碼來實作:

注意:我以上省略了錯誤處理方面的代碼,隻是簡單做個示例, 在實際中,你還需要通過<code>curl_getinfo</code>函數來進行錯誤處理!

上述代碼對于下載下傳比較大型的檔案是不适用的,因為需要先将檔案讀取到記憶體中,等所有内容都讀取完畢,然後再寫入到本地硬碟中。即使php中設定的

memory

limit非常大,這種情況對性能的影響也是很大的。是以,我們對于大型檔案的下載下傳,應該讓curl來接管這個任務,實作邊下載下傳,邊寫入的處理,這樣的

話,就沒什麼問題了。請看下述代碼:

在上述代碼中,我們先打開個本地檔案,并将檔案句柄設定到curl中,然後讓curl一邊讀取遠端資料,一邊寫入到本地檔案中。因為我們不需要在程式中擷取遠端回複的内容了,是以隻要執行請求就可以。

如果伺服器端需要驗證請求,可以通過類似一下示例代碼來實作:

curl還可以通過代理伺服器來向發送請求,請看一下示例代碼:

最後,我們來看下通過curl來想伺服器端發送json資料。具體的代碼如下:

大家可以看到,上述請求是發送到我的本地伺服器的json.php下,我在該檔案中使用json_decode來将接受到的json字元串轉換為對象,然後輸出其中的email字段,代碼如下:

在上述代碼中接受的json字元串為:

如果通過以下php數組生成json字元串的話:

所生成的json字元串如下:

上述json字元串在經過json_decode處理後,就會變成php中的數組格式,如果要擷取email的話,就可以通過<code>$json_data[2]</code>來通路。

curl還有一個進階特性——批處理句柄(handle)。這一特性允許你同時或異步地打開多個url連接配接。

下面是來自來自php.net的示例代碼:

這裡要做的就是打開多個curl句柄并指派給一個批處理句柄。然後你就隻需在一個while循環裡等它執行完畢。

這個示例中有兩個主要循環。第一個 do-while 循環重複調用 <code>curl_multi_exec()</code> 。這個函數是無隔斷(non-blocking)的,但會盡可能少地執行。它傳回一個狀态值,隻要這個值等于常量 <code>curlm_call_multi_perform</code> ,就代表還有一些刻不容緩的工作要做(例如,把對應url的http頭資訊發送出去)。也就是說,我們需要不斷調用該函數,直到傳回值發生改變。

而接下來的 while 循環,隻在 <code>$activ</code>e 變量為 true 時繼續。這一變量之前作為第二個參數傳給了 <code>curl_multi_exec()</code> ,代表隻要批處理句柄中是否還有活動連接配接。接着,我們調用 <code>curl_multi_select()</code> ,在活動連接配接(例如接受伺服器響應)出現之前,它都是被“屏蔽”的。這個函數成功執行後,我們又會進入另一個 do-while 循環,繼續下一條url。

在這篇博文中隻是列舉了一些curl的用途,其中示例代碼是比較簡單的。但是,相信你看完後應該有使用curl的沖動了吧! 那就自己去找相關資料,手冊進行測試吧!

好了,就寫到這裡吧!謝謝你的耐心閱讀!

附: