PHP-Curl使用

來源:互聯網
上載者:User

載自:http://lelong.iteye.com/blog/538645

在這篇文章中主要講解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);
?>

下面我們來看看完成的執行個體代碼:

<?php

// 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);
?>

(查看線上demo )
我們剛剛把另外一個網站的內容,擷取過來以後自動輸出到瀏覽器,我們有沒有其他的方式組織擷取的資訊,然後控制其輸出的內容呢?完全沒有問題,在curl_setopt()函數的參數中,如果希望獲得內容但不輸出,使用CURLOPT_RETURNTRANSFER 參數,並設為非0值/true!,完整代碼請看:

<?php

// 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’ with ‘PHPit’
$output = str_replace(’Google’, ‘PHPit’, $output);
// Print output
echo $output;
?>

(查看線上demo )

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

CURL的相關選項:

如果你看過php手冊中的curl_setopt()函數,你可以注意到了,它下面長長的參數列表,我們不可能一一介紹,更多的內容請查看PHP手冊,這裡只介紹常用的和有的一些參數。

第一個很有意思的參數是 CURLOPT_FOLLOWLOCATION ,當你把這個參數設定為true時,curl會根據任何重新導向命令更深層次的擷取轉向路徑,舉個例子:當你嘗試擷取一個PHP的頁面,然後這個PHP的頁面中有一段跳轉代碼 <?php header(”Location:http://new_url”);….?>,curl將從http://new_url擷取內容,而不是返回跳轉代碼。完整的代碼如下:

<?php

// 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);
?>

(查看線上demo ),
如果Google發送一個轉向請求,上面的例子將根據跳轉的網址繼續擷取內容,和這個參數有關的兩個選項是CURLOPT_MAXREDIRS 和CURLOPT_AUTOREFERER .
參數CURLOPT_MAXREDIRS 選項允許你定義跳轉請求的最大次數,超過了這個次數將不再擷取其內容。如果CURLOPT_AUTOREFERER 設定為true時,curl會自動添加Referer header在每一個跳轉連結,可能它不是很重要,但是在一定的案例中卻非常的有用。

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

<?php
// 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(’name’ => ‘Dennis’, ’surname’ => ‘Pallett’);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// grab URL, and print
curl_exec($ch);
?>

(View Live Demo ) 
And the handle_form.php file:

<?php
echo ‘<h3>Form variables I received: </h3>’;
echo ‘<pre>’;
print_r ($_POST);
echo ‘</pre>’;
?>

正如你可以看到,這使得它真的很容易提交形式,這是一個偉大的方式來測試您的所有形式,而不以填補他們在所有的時間。
參數CURLOPT_CONNECTTIMEOUT 通常用來設定curl嘗試請求連結的時間,這是一個非常重要的選項,如果你把這段時間設定的太短了,可能會導致curl請求失敗。
但是如果你把它設定的時間太長了,可能PHP指令碼將死掉。和這個參數相關的一個選項是 CURLOPT_TIMEOUT ,這是用來設定curl允許執行的時間需求。如果您設定這一個很小的值,它可能會導下載的網頁上是不完整的,因為他們需要一段時間才能下載。
最後一個選項是 CURLOPT_USERAGENT,它允許你自訂請求是的用戶端名稱,比如webspilder或是IE6.0.範例程式碼如下:

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

(View Live Demo)

現在我們把最有意思的一個參數都介紹過了,下面我們來介紹一個curl_getinfo() 函數,看看它能為我們做些什麼。

擷取頁面的資訊:

函數curl_getinfo()可以使得我們擷取接受頁面各種資訊,你能編輯這些資訊通過設定選項的第二個參數,你也可以傳遞一個數組的形式。就像下面的例子:

<?php
// 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 ‘<pre>’;
print_r (curl_getinfo($ch));
echo ‘</pre>’;
?>

(View Live Demo )

大部分返回的資訊是請求本身的,像:這個請求花的時間,返回的標頭檔資訊,當然也有一些頁面的資訊,像頁面內容的大小,最後修改的時間。

那些全是關於curl_getinfo()函數的,現在讓我們看看它的實際用途。

實際用途:

curl庫的第一用途可以查看一個URL頁面是否存在,我們可以通過查看這個URL的請求返回的代碼來判斷比如404代表這個頁面不存在,我們來看一些例子:

<?php
// 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\’t exist’;
} else {
echo $output;
}
?>

(View Live Demo )

其他的使用者可能是建立一個自動檢查器,驗證每個請求的頁面是否存在。
我們可以用curl庫來寫和google類似的網頁蜘蛛(web spider),或是其他的網頁蜘蛛。這篇文章不是關於如何寫一個網頁蜘蛛的,因此所以我們沒有講任何關於網頁蜘蛛的細節問題,但是以後在PHPit 將會介紹用 curl來構造一個web spider.

結論:

在這篇文章我已經表明,如何使用php中的curl庫和其大部分的選項。

為最基本的任務,只想獲得一個網頁,你可能不會需要CURL庫,但是,一旦你想要做任何事情稍微先進的,您可能會想要使用curl庫。

在近未來,我會告訴您究竟如何建立自己的網路蜘蛛,類似Google的網路蜘蛛,敬請期待,以phpit。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.