PHP中十分常用的一個功能是從其他的Web服務中獲取數據,像在Facebook中獲取用戶信息或者在Twitter中獲取最新的推文。這類情境中,HTTP請求是不可避免的。在PHP中,使用cURL來實現HTTP請求是一種非常流行的方式。本文將介紹如何使用cURL來實現HTTP請求。
cURL是一種用于在Web上進行數據傳輸的工具。cURL可以直接將一個URL當作參數來進行傳輸。cURL也支持非常多的高級選項如:cookie支持、純文本輸入、HTML表單處理等。
下面是一個簡單的cURL請求的例子:
//初始cURL $c = curl_init(); //url curl_setopt($c, CURLOPT_URL, 'http://www.example.com/'); //執行請求并獲得響應 $text = curl_exec($c); //關閉連接 curl_close($c); //輸出結果 echo $text;
在上述代碼中,使用curl_init()函數來初始化cURL,然后使用curl_setopt()函數來設置請求的URL。然后,使用curl_exec()函數來執行請求并獲得響應。最后,縮短代碼使用curl_close()函數來關閉請求。本例中的響應被存儲在$text變量中,并被輸出到瀏覽器中。
cURL 可以非常方便的將設置的數據提交到服務器。下面的例子,可以使用 POST 方法向服務器提交表單:
//初始cURL $c = curl_init('http://www.example.com/submitform.php'); //設置HTTP POST參數 curl_setopt($c, CURLOPT_POST, true); curl_setopt($c, CURLOPT_POSTFIELDS, array('field1'=>'value1')); //執行請求并獲得響應 $text = curl_exec($c); //關閉連接 curl_close($c); //輸出結果 echo $text;
在上述代碼中,使用curl_setopt()函數來設置HTTP POST參數。首先,設置了發送 POST 請求,并將POST數據與一個數組一起發送。在本例中,數組只包含一個字段:'field1'。
還有一種情況,需要訪問需要驗證的Web服務。下面是一種使用curl_setopt()函數解決該問題的方法:
//創建一個受保護的訪問令牌 $auth_token = 'username:password'; //需要替換username和password //初始cURL $c = curl_init(); //url curl_setopt($c, CURLOPT_URL, 'http://www.example.com/'); //設置User-Agent頭 curl_setopt($c, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 5.2; rv:21.0) Gecko/20130326 Firefox/21.0'); //開啟驗證請求 curl_setopt($c, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); //設置傳遞用戶名和密碼 curl_setopt($c, CURLOPT_USERPWD, $auth_token); //執行請求并獲得響應 $text = curl_exec($c); //關閉連接 curl_close($c); //輸出結果 echo $text;
在這個例子中,使用curl_setopt()設置了一個User-Agent頭,指定請求中包含驗證信息和具體的用戶名和密碼。請求時,服務器會驗證這些信息。
一些Web服務會在返回數據之前進行流量限制,如果您的應用程序試圖通過短時間內進行大量請求,您的應用程序可能會因此受到影響。解決這一問題的方法是使用curl_setopt()函數來設置請求數據:
//初始cURL $c = curl_init(); //設置URL地址 curl_setopt($c, CURLOPT_URL, $url); //設置超時時間 curl_setopt($c, CURLOPT_TIMEOUT, 5); //禁用DNS緩存 curl_setopt($c, CURLOPT_DNS_CACHE_TIMEOUT, 0); //禁用連接后緩存所有響應 curl_setopt($c, CURLOPT_FRESH_CONNECT, true); //開啟請求 $text = curl_exec($c); //關閉連接 curl_close($c); //輸出結果 echo $text;
在上述例子中,curl_setopt()函數用于設置cURL的超時時間,禁用DNS緩存并禁用連接后緩存所有響應。
除了上述示例之外,Curl還有很多高級操作和相關函數可以使用。如果您希望以更高效的方式獲取數據,可以查閱相關的官方文檔。