是利用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><?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>?></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>=></code><code>‘myname‘</code><code>,</code>
<code> </code><code>‘pwd‘</code><code>=></code><code>‘mypassword‘</code>
<code> </code><code>);</code>
<code> </code><code>//或者 $curlPost = ‘name=myname&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值了;還可以實作上傳檔案的功能等等。