首頁  >  文章  >  後端開發  >  在PHP中使用curl_init函數的說明

在PHP中使用curl_init函數的說明

高洛峰
高洛峰原創
2017-06-01 09:34:321332瀏覽

$ch = curl_init(); 
$c_url = 'http://www.baidu.com'; 
$c_url_data = "product_&type=".$type.""; 
curl_setopt($ch, CURLOPT_URL,$c_url); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $c_url_data); 
echo $result = curl_exec($ch); 
curl_close ($ch); 
unset($ch);

這篇文章中主要講解php_curl函式庫的知識,並教你如何更好的使用php_curl。 
簡介 
你可能在你的編寫PHP腳本程式碼中會遇到這樣的問題:怎麼樣才能從其他網站取得內容呢?這裡有幾個解決方式;最簡單的就是在php中使用fopen()函數,但是fopen函數沒有足夠的參數來使用,例如當你想建立一個“網路爬蟲”,想定義爬蟲的客戶端描述(IE ,firefox),透過不同的請求方式來取得內容,例如POST,GET;等等這些需求是不可能用fopen()函數實現的。 
為了解決我們上面提出的問題,我們可以使用PHP的擴充庫-Curl,這個擴充庫通常是預設在安裝包中的,你可以它來取得其他網站的內容,也可以來幹別的。 
備註:這兩段程式碼需要php_curl擴充函式庫的支持,查看phpinfo(),如果curl support enabled則表示支援curl函式庫。 
1、Windows下的PHP開啟curl函式庫支援: 
開啟php.ini,將extension=php_curl.dll前的;號碼去掉。
2、Linux下的PHP開啟curl函式庫支援: 
編譯PHP時在./configure後加上–with-curl 
在這篇文章中,我們一起來看看如何使用curl函式庫,看看它的其他用處,但是接下來,我們要從最基本的用法開始 
基本用法: 
第一步,我們通過函數curl_init()創建一個新的curl會話,代碼如下: 

<?php
// create a new curl resource 
$ch = curl_init(); 
?>

我們已經成功創建了一個curl會話,如果需要獲取一個URL的內容,那麼接下的一步,傳遞一個URL給curl_setopt()函數,代碼: 

<?php
// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, “http://www.google.com/”); 
?>

做完上一步工作,curl的準備工作做完了,curl將會獲取URL站點的內容,並列印出來。程式碼: 

<?php
// grab URL and pass it to the browser 
curl_exec($ch); 
?>

最後,關閉目前的curl會話 

<?php
//close curl resource, and free up system resources 
curl_close($ch); 
?>

下面我們來看看完成的實例代碼: 

// create a new curl resource 
$ch = curl_init(); 
// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, “http://www.google.nl/”); 
// grab URL and pass it to the browser 
curl_exec($ch); 
// close curl resource, and free up system resources 
curl_close($ch); 
?>

我們剛剛把另外一個站點的內容,過來過來

// create a new curl resource 
$ch = curl_init(); 
// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, “http://www.google.nl/”); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
// grab URL, and return output 
$output = curl_exec($ch); 
// close curl resource, and free up system resources 
curl_close($ch); 
// Replace ‘Google&#39; with ‘PHPit&#39; 
$output = str_replace(&#39;Google&#39;, ‘PHPit&#39;, $output); 
// Print output 
echo $output; 
?>

我們剛剛把另一個站點的內容,過來以後有沒有其他的方式組織所獲取的訊息,然後控制其輸出的內容呢?完全沒有問題,在curl_setopt()函數的參數中,如果希望獲得內容但不輸出,使用CURLOPT_RETURNTRANSFER參數,並設為非0值/true!,完整代碼請看: 
// create a new curl resource 
$ch = curl_init(); 
// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, “http://www.google.com/”); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
// grab URL, and print 
curl_exec($ch); 
?>

在上面的2個實例中,你可能注意到透過設定函數curl_setopt()的不同參數,可以得到不同結果,這正是curl強大的原因,下面我們來看看這些參數的意義。

CURL的相關選項: 

如果你看​​過php手冊中的curl_setopt()函數,你可以注意到了,它下面長長的參數列表,我們不可能一一介紹,更多的內容請查看PHP手冊,這裡只介紹常用的和有的一些參數。
第一個很有趣的參數是CURLOPT_FOLLOWLOCATION ,當你把這個參數設為true時,curl會根據任何重定向命令更深層次的獲取轉向路徑,舉個例子:當你嘗試獲取一個PHP的頁面,然後這個PHP的頁面中有一段跳躍程式碼,curl將從http://new_url取得內容,而不是返回跳躍程式碼。完整的程式碼如下: 

// create a new curl resource 
$ch = curl_init(); 
// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL,”http://projects/phpit/content/using%20curl%20php/demos/handle_form.php”); 
// Do a POST 
$data = array(&#39;name&#39; => ‘Dennis&#39;, &#39;surname&#39; => ‘Pallett&#39;); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
// grab URL, and print 
curl_exec($ch); 
?> 
And the handle_form.php file: 
echo ‘Form variables I received:&#39;; 
echo ‘&#39;; 
print_r ($_POST); 
echo ‘&#39;; 
?>

如果Google發送一個轉向請求,上面的例子將根據跳轉的網址繼續獲取內容,和這個參數有關的兩個選項是CURLOPT_MAXREDIRS和CURLOPT_AUTOREFERER . 

參數CURLOPT_MAXREDIRS請求的最大次數,超過了這個次數將不再取得其內容。如果CURLOPT_AUTOREFERER 設定為true時,curl會自動添加Referer header在每一個跳轉鏈接,可能它不是很重要,但是在一定的案例中卻非常的有用。

下一步介紹的參數是CURLOPT_POST,這是一個非常有用的功能,因為它可以讓您這樣做POST請求,而不是GET請求,這實際上意味著你可以提交 
其他形式的頁面,無須其實在表單中填入。下面的例子表明我的意思: 

// create a new curl resource 
$ch = curl_init(); 
// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, “http://sc.jb51.net/”); 
curl_setopt($ch, CURLOPT_USERAGENT, ‘My custom web spider/0.1′); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
// grab URL, and print 
curl_exec($ch); 
?>

正如你可以看到,這使得它真的很容易提交形式,這是一個偉大的方式來測試您的所有形式,而不以填補他們在所有的時間。 

參數CURLOPT_CONNECTTIMEOUT 通常用來設定curl嘗試請求連結的時間,這是一個非常重要的選項,如果你把這段時間設定的太短了,可能會導致curl請求失敗。 🎜但是如果你把它設定的時間太長了,可能PHP腳本就會死掉。和這個參數相關的一個選項是 CURLOPT_TIMEOUT,這是用來設定curl允許執行的時間需求。如果您設定這一個很小的值,它可能會導下載的網頁上是不完整的,因為他們需要一段時間才能下載。 🎜最後一個選項是 CURLOPT_USERAGENT,它允許你自訂請求是的客戶端名稱,例如webspilder或是IE6.0.範例程式碼如下: 🎜
// create a new curl resource 
$ch = curl_init(); 
// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, “http://sc.jb51.net/”); 
curl_setopt($ch, CURLOPT_USERAGENT, ‘My custom web spider/0.1′); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
// grab URL, and print 
curl_exec($ch); 
?>

现在我们把最有意思的一个参数都介绍过了,下面我们来介绍一个curl_getinfo() 函数,看看它能为我们做些什么。 
获取页面的信息: 
函数curl_getinfo()可以使得我们获取接受页面各种信息,你能编辑这些信息通过设定选项的第二个参数,你也可以传递一个数组的形式。就像下面的例子: 

// create a new curl resource 
$ch = curl_init(); 
// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, “http://www.google.com”); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_FILETIME, true); 
// grab URL 
$output = curl_exec($ch); 
// Print info 
echo ‘&#39;; 
print_r (curl_getinfo($ch)); 
echo ‘&#39;; 
?>

大部分返回的信息是请求本身的,像:这个请求花的时间,返回的头文件信息,当然也有一些页面的信息,像页面内容的大小,最后修改的时间。 
那些全是关于curl_getinfo()函数的,现在让我们看看它的实际用途。 
实际用途: 
curl库的第一用途可以查看一个URL页面是否存在,我们可以通过查看这个URL的请求返回的代码来判断比如404代表这个页面不存在,我们来看一些例子: 

// create a new curl resource 
$ch = curl_init(); 
// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, “http://www.google.com/does/not/exist”); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
// grab URL 
$output = curl_exec($ch); 
// Get response code 
$response_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
// Not found? 
if ($response_code == ‘404′) { 
echo ‘Page doesn\&#39;t exist&#39;; 
} else { 
echo $output; 
} 
?>

其他的用户可能是创建一个自动检查器,验证每个请求的页面是否存在。 
我们可以用curl库来写和google类似的网页蜘蛛(web spider),或是其他的网页蜘蛛。这篇文章不是关于如何写一个网页蜘蛛的,因此所以我们没有讲任何关于网页蜘蛛的细节问题,但是以后在PHPit 将会介绍用 curl来构造一个web spider. 
结论: 
在这篇文章我已经表明,如何使用php中的curl库和其大部分的选项。 
为最基本的任务,只想获得一个网页,你可能不会需要CURL库,但是,一旦你想要做任何事情稍微先进的,您可能会想要使用curl库。 
在近未来,我会告诉您究竟如何建立自己的网络蜘蛛,类似Google的网络蜘蛛,敬请期待,以phpit。

更多在PHP中使用curl_init函数的说明相关文章请关注PHP中文网!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn