天天看點

PHP cURL子產品

     是利用URL文法在指令行方式下工作的檔案傳輸工具,目前蘋果機器已經内置了cURL。cURL是一個綜合性的傳輸工具,對HTTP、FTP等協定提供了廣泛的支援,它甚至可以實作迅雷、快車等下載下傳工具的所有功能。PHP中也提供了對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和使用者名+密碼的認證。

  一般讀取檔案(URL)的方法是使用PHP内置的一些讀檔案函數,比如file_get_contents,file等(參見文章《》);但是這些方法都隻能進行簡單的檔案讀取,不能實作複雜的功能:向URL

POST資料、使用代理伺服器、讀取使用SSL協定的URL、URL登陸認證等。而cURL恰恰提供了對這些功能的支援。

拷貝PHP目錄中的libeay32.dll 和 ssleay32.dll 兩個檔案到 C:\windows\system32 目錄。

修改php.ini。去掉 extension = php_curl.dll 前面的分号。

重新開機Apache服務

檢視phpinfo,可以看到curl已開啟

    使用curl_init方法初始化一個cURL句柄

  $ch = curl_init(“http://www.example.com/”);

  curl_init方法提供了一個可選參數URL,傳回一個cURL句柄供curl_setopt(), curl_exec()和curl_close() 函數使用。

如果在curl_init中沒有指定URL,則需要在curl_setopt中手工設定這個值,如果指定了URL,則CURLOPT_URL被自動設成這個值。

    使用curl_setopt方法設定一個cURL傳輸參數,或者使用curl_setopt_array批量設定一組參數。

  

 curl_setopt($ch, CURLOPT_FILE, $fp);

curl_setopt($ch, CURLOPT_HEADER, 0);

    其中$ch為curl_init初始化時傳回的cURL句柄。

    使用curl_exec執行一個cURL會話,成功時傳回 TRUE,

或者在失敗時傳回 FALSE.

然而,如果 CURLOPT_RETURNTRANSFER選項被設定,函數執行成功時會傳回執行的結果,失敗時傳回 FALSE 。

    curl_exec($ch);

    還可以使用curl_getinfo擷取一個cURL會話的資訊。

    curl_getinfo($info);

    curl_getinfo傳回的數組中包括如下資訊:

“url” //資源網絡位址

“content_type” //内容編碼

“http_code” //HTTP狀态碼

“header_size” //header的大小

“request_size” //請求的大小

“filetime” //檔案建立時間

“ssl_verify_result” //SSL驗證結果

“redirect_count” //跳轉技術

“total_time” //總耗時

“namelookup_time” //DNS查詢耗時

“connect_time” //等待連接配接耗時

“pretransfer_time” //傳輸前準備耗時

“size_upload” //上傳資料的大小

“size_download” //下載下傳資料的大小

“speed_download” //下載下傳速度

“speed_upload” //上傳速度

“download_content_length”//下載下傳内容的長度

“upload_content_length” //上傳内容的長度

“starttransfer_time” //開始傳輸的時間

“redirect_time”//重定向耗時

    使用curl_close關閉cURL會話,并釋放所有資源(包括cURL句柄$ch等)。

    curl_close($ch);

  一個完整的例子如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

<code>&lt;?php</code>

<code>    </code><code>// 1. 初始化</code>

<code>    </code><code>$ch</code>

<code>= curl_init(</code><code>"http://www.baidu.com"</code><code>);</code>

<code>    </code><code>// 2. 設定選項</code>

<code>    </code><code>curl_setopt(</code><code>$ch</code><code>, CURLOPT_RETURNTRANSFER, 1);  </code><code>//将curl_exec()擷取的資訊以檔案流的形式傳回,而不是直接輸出,如果沒有設定CURLOPT_RETURNTRANSFER,curl_exec($ch)将直接輸出傳回内容。</code>

<code>    </code><code>// 3. 執行會話并擷取内容</code>

<code>    </code><code>$output</code>

<code>= curl_exec(</code><code>$ch</code><code>);  </code><code>//或者使用curl_multi_getcontent()擷取會話傳回的内容</code>

<code>    </code><code>echo</code>

<code>$output</code><code>;</code>

<code>    </code><code>$info</code>

<code>= curl_getinfo(</code><code>$ch</code><code>);</code>

<code>    </code><code>print_r(</code><code>$info</code><code>);</code>

<code>    </code><code>// 4. 關閉curl會話</code>

<code>    </code><code>curl_close(</code><code>$ch</code><code>);</code>

<code>?&gt;</code>

當然我們還可以使用curl_error來擷取會話的錯誤資訊。

<code>if</code><code>(</code><code>$output</code>

<code>=== false)</code><code>//注意是三個等号,表示檢查傳回值是boolean類型,如果是兩個等号,傳回值為空字元串也會被認為是false</code>

<code>‘cURL error:‘</code><code>.curl_error(</code><code>$ch</code><code>);</code>

例如,我們直接通路支付寶的首頁,由于支付寶首頁基于SSL協定,直接通路會提示證書錯誤:

<code>cURL error:SSL certificate problem, verify that the CA cert is OK. Details:</code>

<code>error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed</code>

使用代理伺服器

<code>    </code><code>// 2. 設定代理伺服器</code>

<code>    </code><code>curl_setopt(</code><code>$ch</code><code>, CURLOPT_PROXY,</code><code>‘127.0.0.1:8888‘</code><code>);</code>

<code>    </code><code>// 3. 執行會話</code>

<code>    </code><code>curl_exec(</code><code>$ch</code><code>);</code>

向URL POST資料

14

15

16

17

18

19

20

<code>    </code><code>//POST資料</code>

<code>    </code><code>$curlPost</code>

<code>=</code><code>array</code><code>(</code>

<code>        </code><code>‘name‘</code><code>=&gt;</code><code>‘myname‘</code><code>,</code>

<code>        </code><code>‘pwd‘</code><code>=&gt;</code><code>‘mypassword‘</code>

<code>    </code><code>);</code>

<code>    </code><code>//或者 $curlPost = ‘name=myname&amp;pwd=mypassword‘;</code>

<code>  </code><code>//初始化</code>

<code>= curl_init(</code><code>"http://localhost/SP/getpost.php"</code><code>);</code>

<code>    </code><code>//設定</code>

<code>    </code><code>curl_setopt(</code><code>$ch</code><code>, CURLOPT_RETURNTRANSFER, 1);</code>

<code>    </code><code>curl_setopt(</code><code>$ch</code><code>, CURLOPT_POST, 1);   </code><code>//設施post方式送出資料</code>

<code>    </code><code>curl_setopt(</code><code>$ch</code><code>, CURLOPT_POSTFIELDS,</code><code>$curlPost</code><code>);   </code><code>//設定POST的資料</code>

<code>    </code><code>//執行會話并擷取内容</code>

<code>= curl_exec(</code><code>$ch</code><code>);</code>

<code>    </code><code>//關閉curl會話</code>

使用浏覽器使用者代理

<code>    </code><code>// 2. 設定</code>

<code>    </code><code>//設定User-Agent為iPhone下的Safafi</code>

<code>    </code><code>curl_setopt(</code><code>$ch</code><code>, CURLOPT_USERAGENT,</code><code>‘Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.‘</code><code>);</code>

<code>    </code><code>// 4. 釋放curl句柄</code>

通路SSL協定的URL

<code>= curl_init(</code><code>"https://www.alipay.com"</code><code>);</code>

<code>    </code><code>curl_setopt(</code><code>$ch</code><code>, CURLOPT_SSL_VERIFYPEER, false);</code><code>//使用伺服器端驗證</code>

<code>    </code><code>curl_setopt(</code><code>$ch</code><code>, CURLOPT_USERPWD,</code><code>"myusername:mypassword"</code><code>);</code><code>//設定登入使用者名和密碼</code>

<code>    </code><code>curl_setopt(</code><code>$ch</code><code>, CURLOPT_FOLLOWLOCATION, 1);</code><code>//允許伺服器端重定向</code>

cURL還有很多其他的實際用途,比如檢查你部落格的友情連結是否都有效,這裡就需要用到curl_getinfo()函數傳回的http_code值了;還可以實作上傳檔案的功能等等。