色尼玛亚洲综合影院,亚洲3atv精品一区二区三区,麻豆freexxxx性91精品,欧美在线91

基于PHP的cURL快速入門(mén)教程 (小偷采集程序)

最爽的是,php也支持 cURL 庫(kù)。本文將介紹 cURL 的一些高級(jí)特性,以及在php中如何運(yùn)用它。

為什么要用 cURL?

是的,我們可以通過(guò)其他辦法獲取網(wǎng)頁(yè)內(nèi)容。大多數(shù)時(shí)候,我因?yàn)橄胪祽校贾苯佑煤?jiǎn)單的php函數(shù):

$content = file_get_contents("http://www.jb51.NET");
// or
$lines = file("http://www.jb51.NET");
// or
readfile(http://www.jb51.NET);

不過(guò),這種做法缺乏靈活性和有效的錯(cuò)誤處理。而且,你也不能用它完成一些高難度任務(wù)――比如處理coockies、驗(yàn)證、表單提交、文件上傳等等。

引用:
cURL 是一種功能強(qiáng)大的庫(kù),支持很多不同的協(xié)議、選項(xiàng),能提供 URL 請(qǐng)求相關(guān)的各種細(xì)節(jié)信息。

基本結(jié)構(gòu)

在學(xué)習(xí)更為復(fù)雜的功能之前,先來(lái)看一下在php中建立cURL請(qǐng)求的基本步驟:

  1. 初始化
  2. 設(shè)置變量
  3. 執(zhí)行并獲取結(jié)果
  4. 釋放cURL句柄

// 1. 初始化
$ch = curl_init();
// 2. 設(shè)置選項(xiàng),包括URL
curl_setopt($ch, CURLOPT_URL, "http://www.jb51.NET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 3. 執(zhí)行并獲取HTML文檔內(nèi)容
$output = curl_exec($ch);
// 4. 釋放curl句柄
curl_close($ch);

第二步(也就是 curl_setopt() )最為重要,一切玄妙均在此。有一長(zhǎng)串cURL參數(shù)可供設(shè)置,它們能指定URL請(qǐng)求的各個(gè)細(xì)節(jié)。要一次性全部看完并理解可能比較困難,所以今天我們只試一下那些更常用也更有用的選項(xiàng)。

檢查錯(cuò)誤

你可以加一段檢查錯(cuò)誤的語(yǔ)句(雖然這并不是必需的):

// ...
$output = curl_exec($ch);
if ($output === FALSE) {
    echo "cURL Error: " . curl_error($ch);
}
// ...

請(qǐng)注意,比較的時(shí)候我們用的是“=== FALSE”,而非“== FALSE”。因?yàn)槲覀兊脜^(qū)分 空輸出 和 布爾值FALSE,后者才是真正的錯(cuò)誤。

獲取信息

這是另一個(gè)可選的設(shè)置項(xiàng),能夠在cURL執(zhí)行后獲取這一請(qǐng)求的有關(guān)信息:

// ...
curl_exec($ch);
$info = curl_getinfo($ch);
echo '獲取'. $info['url'] . '耗時(shí)'. $info['total_time'] . '秒';
// ...

返回的數(shù)組中包括了以下信息:

  • “url” //資源網(wǎng)絡(luò)地址
  • “content_type” //內(nèi)容編碼
  • “http_code” //HTTP狀態(tài)碼
  • “header_size” //header的大小
  • “request_size” //請(qǐng)求的大小
  • “filetime” //文件創(chuàng)建時(shí)間
  • “ssl_verify_result” //SSL驗(yàn)證結(jié)果
  • “redirect_count” //跳轉(zhuǎn)技術(shù)  
  • “total_time” //總耗時(shí)
  • “namelookup_time” //DNS查詢耗時(shí)
  • “connect_time” //等待連接耗時(shí)
  • “pretransfer_time” //傳輸前準(zhǔn)備耗時(shí)
  • “size_upload” //上傳數(shù)據(jù)的大小
  • “size_download” //下載數(shù)據(jù)的大小
  • “speed_download” //下載速度
  • “speed_upload” //上傳速度
  • “download_content_length”//下載內(nèi)容的長(zhǎng)度
  • “upload_content_length” //上傳內(nèi)容的長(zhǎng)度  
  • “starttransfer_time” //開(kāi)始傳輸?shù)臅r(shí)間
  • “redirect_time”//重定向耗時(shí)

基于瀏覽器的重定向

在第一個(gè)例子中,我們將提供一段用于偵測(cè)服務(wù)器是否有基于瀏覽器的重定向的代碼。例如,有些網(wǎng)站會(huì)根據(jù)是否是手機(jī)瀏覽器甚至用戶來(lái)自哪個(gè)國(guó)家來(lái)重定向網(wǎng)頁(yè)。

我們利用 CURLOPT_HTTPHEADER 選項(xiàng)來(lái)設(shè)定我們發(fā)送出的HTTP請(qǐng)求頭信息(http headers),包括user agent信息和默認(rèn)語(yǔ)言。然后我們來(lái)看看這些特定網(wǎng)站是否會(huì)把我們重定向到不同的URL。

// 測(cè)試用的URL
$urls = array(
    "http://www.cnn.com",
    "http://www.mozilla.com",
    "http://www.facebook.com"
);
// 測(cè)試用的瀏覽器信息
$browsers = array(
    "standard" => array (
        "user_agent" => "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6 (.NET CLR 3.5.30729)",
        "language" => "en-us,en;q=0.5"
        ),
    "iphone" => array (
        "user_agent" => "Mozilla/5.0 (iPhone; U; CPU like Mac OS X; en) AppleWebKit/420+ (KHTML, like Gecko) Version/3.0 Mobile/1A537a Safari/419.3",
        "language" => "en"
        ),
    "french" => array (
        "user_agent" => "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; GTB6; .NET CLR 2.0.50727)",
        "language" => "fr,fr-FR;q=0.5"
        )
);
foreach ($urls as $url) {
    echo "URL: $url/n";
    foreach ($browsers as $test_name => $browser) {
        $ch = curl_init();
        // 設(shè)置 url
        curl_setopt($ch, CURLOPT_URL, $url);
        // 設(shè)置瀏覽器的特定header
        curl_setopt($ch, CURLOPT_HTTPHEADER, array(
                "User-Agent: {$browser['user_agent']}",
                "Accept-Language: {$browser['language']}"
            ));
        // 頁(yè)面內(nèi)容我們并不需要
        curl_setopt($ch, CURLOPT_NOBODY, 1);
        // 只需返回HTTP header
        curl_setopt($ch, CURLOPT_HEADER, 1);
        // 返回結(jié)果,而不是輸出它
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $output = curl_exec($ch);
        curl_close($ch);
        // 有重定向的HTTP頭信息嗎?
        if (preg_match("!Location: (.*)!", $output, $matches)) {
            echo "$test_name: redirects to $matches[1]/n";
        } else {
            echo "$test_name: no redirection/n";
        }
    }
    echo "/n/n";
}

首先,我們建立一組需要測(cè)試的URL,接著指定一組需要測(cè)試的瀏覽器信息。最后通過(guò)循環(huán)測(cè)試各種URL和瀏覽器匹配可能產(chǎn)生的情況。

因?yàn)槲覀冎付薱URL選項(xiàng),所以返回的輸出內(nèi)容則只包括HTTP頭信息(被存放于 $output 中)。利用一個(gè)簡(jiǎn)單的正則,我們檢查這個(gè)頭信息中是否包含了“Location:”字樣。

運(yùn)行這段代碼應(yīng)該會(huì)返回如下結(jié)果:

用POST方法發(fā)送數(shù)據(jù)

當(dāng)發(fā)起GET請(qǐng)求時(shí),數(shù)據(jù)可以通過(guò)“查詢字串”(query string)傳遞給一個(gè)URL。例如,在google中搜索時(shí),搜索關(guān)鍵即為URL的查詢字串的一部分:

http://www.google.com/search?q=NETtuts

這種情況下你可能并不需要cURL來(lái)模擬。把這個(gè)URL丟給“file_get_contents()”就能得到相同結(jié)果。

不過(guò)有一些HTML表單是用POST方法提交的。這種表單提交時(shí),數(shù)據(jù)是通過(guò) HTTP請(qǐng)求體(request body) 發(fā)送,而不是查詢字串。例如,當(dāng)使用CodeIgniter論壇的表單,無(wú)論你輸入什么關(guān)鍵字,總是被POST到如下頁(yè)面:

http://codeigniter.com/forums/do_search/

你可以用php腳本來(lái)模擬這種URL請(qǐng)求。首先,新建一個(gè)可以接受并顯示POST數(shù)據(jù)的文件,我們給它命名為post_output.php

print_r($_POST);

接下來(lái),寫(xiě)一段php腳本來(lái)執(zhí)行cURL請(qǐng)求:

$url = "http://localhost/post_output.php";
$post_data = array (
    "foo" => "bar",
    "query" => "NETtuts",
    "action" => "Submit"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 我們?cè)赑OST數(shù)據(jù)哦!
curl_setopt($ch, CURLOPT_POST, 1);
// 把post的變量加上
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;

執(zhí)行代碼后應(yīng)該會(huì)得到以下結(jié)果:

這段腳本發(fā)送一個(gè)POST請(qǐng)求給 post_output.php ,這個(gè)頁(yè)面 $_POST 變量并返回,我們利用cURL捕捉了這個(gè)輸出。

文件上傳

上傳文件和前面的POST十分相似。因?yàn)樗械奈募蟼鞅韱味际峭ㄟ^(guò)POST方法提交的。

首先新建一個(gè)接收文件的頁(yè)面,命名為 upload_output.php

print_r($_FILES);

以下是真正執(zhí)行文件上傳任務(wù)的腳本:

$url = "http://localhost/upload_output.php";
$post_data = array (
    "foo" => "bar",
    // 要上傳的本地文件地址
    "upload" => "@C:/wamp/www/test.zip"
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;

如果你需要上傳一個(gè)文件,只需要把文件路徑像一個(gè)post變量一樣傳過(guò)去,不過(guò)記得在前面加上@符號(hào)。執(zhí)行這段腳本應(yīng)該會(huì)得到如下輸出:

cURL批處理(multi cURL)

cURL還有一個(gè)高級(jí)特性――批處理句柄(handle)。這一特性允許你同時(shí)或異步地打開(kāi)多個(gè)URL連接。

下面是來(lái)自來(lái)自php.NET的示例代碼:

// 創(chuàng)建兩個(gè)cURL資源
$ch1 = curl_init();
$ch2 = curl_init();
// 指定URL和適當(dāng)?shù)膮?shù)
curl_setopt($ch1, CURLOPT_URL, "http://lxr.php.NET/");
curl_setopt($ch1, CURLOPT_HEADER, 0);
curl_setopt($ch2, CURLOPT_URL, "http://www.php.NET/");
curl_setopt($ch2, CURLOPT_HEADER, 0);
// 創(chuàng)建cURL批處理句柄
$mh = curl_multi_init();
// 加上前面兩個(gè)資源句柄
curl_multi_add_handle($mh,$ch1);
curl_multi_add_handle($mh,$ch2);
// 預(yù)定義一個(gè)狀態(tài)變量
$active = null;
// 執(zhí)行批處理
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($mh) != -1) {
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
    }
}
// 關(guān)閉各個(gè)句柄
curl_multi_remove_handle($mh, $ch1);
curl_multi_remove_handle($mh, $ch2);
curl_multi_close($mh);

這里要做的就是打開(kāi)多個(gè)cURL句柄并指派給一個(gè)批處理句柄。然后你就只需在一個(gè)while循環(huán)里等它執(zhí)行完畢。

這個(gè)示例中有兩個(gè)主要循環(huán)。第一個(gè) do-while 循環(huán)重復(fù)調(diào)用 curl_multi_exec() 。這個(gè)函數(shù)是無(wú)隔斷(non-blocking)的,但會(huì)盡可能少地執(zhí)行。它返回一個(gè)狀態(tài)值,只要這個(gè)值等于常量 CURLM_CALL_MULTI_PERFORM ,就代表還有一些刻不容緩的工作要做(例如,把對(duì)應(yīng)URL的http頭信息發(fā)送出去)。也就是說(shuō),我們需要不斷調(diào)用該函數(shù),直到返回值發(fā)生改變。

而接下來(lái)的 while 循環(huán),只在 $active 變量為 true 時(shí)繼續(xù)。這一變量之前作為第二個(gè)參數(shù)傳給了 curl_multi_exec() ,代表只要批處理句柄中是否還有活動(dòng)連接。接著,我們調(diào)用 curl_multi_select() ,在活動(dòng)連接(例如接受服務(wù)器響應(yīng))出現(xiàn)之前,它都是被“屏蔽”的。這個(gè)函數(shù)成功執(zhí)行后,我們又會(huì)進(jìn)入另一個(gè) do-while 循環(huán),繼續(xù)下一條URL。

還是來(lái)看一看怎么把這一功能用到實(shí)處吧:

WordPress 連接檢查器

想象一下你有一個(gè)文章數(shù)目龐大的博客,這些文章中包含了大量外部網(wǎng)站鏈接。一段時(shí)間之后,因?yàn)檫@樣那樣的原因,這些鏈接中相當(dāng)數(shù)量都失效了。要么是被和諧了,要么是整個(gè)站點(diǎn)都被功夫網(wǎng)了...

我們下面建立一個(gè)腳本,分析所有這些鏈接,找出打不開(kāi)或者404的網(wǎng)站/網(wǎng)頁(yè),并生成一個(gè)報(bào)告。

請(qǐng)注意,以下并不是一個(gè)真正可用的WordPress插件,僅僅是一段獨(dú)立功能的腳本而已,僅供演示,謝謝。

好,開(kāi)始吧。首先,從數(shù)據(jù)庫(kù)中讀取所有這些鏈接:

// CONFIG
$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'wordpress';
$excluded_domains = array(
    'localhost', 'www.mydomain.com');
$max_connections = 10;
// 初始化一些變量
$url_list = array();
$working_urls = array();
$dead_urls = array();
$not_found_urls = array();
$active = null;
// 連到 MySQL
if (!mysql_connect($db_host, $db_user, $db_pass)) {
    die('Could not connect: ' . mysql_error());
}
if (!mysql_select_db($db_name)) {
    die('Could not select db: ' . mysql_error());
}
// 找出所有含有鏈接的文章
$q = "SELECT post_content FROM wp_posts
    WHERE post_content LIKE '%href=%'
    AND post_status = 'publish'
    AND post_type = 'post'";
$r = mysql_query($q) or die(mysql_error());
while ($d = mysql_fetch_assoc($r)) {
    // 用正則匹配鏈接
    if (preg_match_all("!href=/"(.*?)/"!", $d['post_content'], $matches)) {
        foreach ($matches[1] as $url) {
            // exclude some domains
            $tmp = parse_url($url);
            if (in_array($tmp['host'], $excluded_domains)) {
                continue;
            }
            // store the url
            $url_list []= $url;
        }
    }
}
// 移除重復(fù)鏈接
$url_list = array_values(array_unique($url_list));
if (!$url_list) {
    die('No URL to check');
}

我們首先配置好數(shù)據(jù)庫(kù),一系列要排除的域名($excluded_domains),以及最大并發(fā)連接數(shù)($max_connections)。然后,連接數(shù)據(jù)庫(kù),獲取文章和包含的鏈接,把它們收集到一個(gè)數(shù)組中($url_list)。

下面的代碼有點(diǎn)復(fù)雜了,因此我將一小步一小步地詳細(xì)解釋?zhuān)?/P>

// 1. 批處理器
$mh = curl_multi_init();
// 2. 加入需批量處理的URL
for ($i = 0; $i < $max_connections; $i++) {
    add_url_to_multi_handle($mh, $url_list);
}
// 3. 初始處理
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
// 4. 主循環(huán)
while ($active && $mrc == CURLM_OK) {
    // 5. 有活動(dòng)連接
    if (curl_multi_select($mh) != -1) {
        // 6. 干活
        do {
            $mrc = curl_multi_exec($mh, $active);
        } while ($mrc == CURLM_CALL_MULTI_PERFORM);
        // 7. 有信息否?
        if ($mhinfo = curl_multi_info_read($mh)) {
            // 意味著該連接正常結(jié)束
            // 8. 從curl句柄獲取信息
            $chinfo = curl_getinfo($mhinfo['handle']);
            // 9. 死鏈么?
            if (!$chinfo['http_code']) {
                $dead_urls []= $chinfo['url'];
            // 10. 404了?
            } else if ($chinfo['http_code'] == 404) {
                $not_found_urls []= $chinfo['url'];
            // 11. 還能用
            } else {
                $working_urls []= $chinfo['url'];
            }
            // 12. 移除句柄
            curl_multi_remove_handle($mh, $mhinfo['handle']);
            curl_close($mhinfo['handle']);
            // 13. 加入新URL,干活
            if (add_url_to_multi_handle($mh, $url_list)) {
                do {
                    $mrc = curl_multi_exec($mh, $active);
                } while ($mrc == CURLM_CALL_MULTI_PERFORM);
            }
        }
    }
}
// 14. 完了
curl_multi_close($mh);
echo "==Dead URLs==/n";
echo implode("/n",$dead_urls) . "/n/n";
echo "==404 URLs==/n";
echo implode("/n",$not_found_urls) . "/n/n";
echo "==Working URLs==/n";
echo implode("/n",$working_urls);
// 15. 向批處理器添加url
function add_url_to_multi_handle($mh, $url_list) {
    static $index = 0;
    // 如果還剩url沒(méi)用
    if ($url_list[$index]) {
        // 新建curl句柄
        $ch = curl_init();
        // 配置url
        curl_setopt($ch, CURLOPT_URL, $url_list[$index]);
        // 不想輸出返回的內(nèi)容
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        // 重定向到哪兒我們就去哪兒
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
        // 不需要內(nèi)容體,能夠節(jié)約帶寬和時(shí)間
        curl_setopt($ch, CURLOPT_NOBODY, 1);
        // 加入到批處理器中
        curl_multi_add_handle($mh, $ch);
        // 撥一下計(jì)數(shù)器,下次調(diào)用該函數(shù)就能添加下一個(gè)url了
        $index++;
        return true;
    } else {
        // 沒(méi)有新的URL需要處理了
        return false;
    }
}

下面解釋一下以上代碼。列表的序號(hào)對(duì)應(yīng)著代碼注釋中的順序數(shù)字。

  1. 新建一個(gè)批處理器。Created a multi handle.
  2. 稍后我們將創(chuàng)建一個(gè)把URL加入批處理器的函數(shù) add_url_to_multi_handle() 。每當(dāng)這個(gè)函數(shù)被調(diào)用,就有一個(gè)新url被加入批處理器。一開(kāi)始,我們給批處理器添加了10個(gè)URL(這一數(shù)字由 $max_connections 所決定)。
  3.   運(yùn)行 curl_multi_exec()  進(jìn)行初始化工作是必須的,只要它返回 CURLM_CALL_MULTI_PERFORM 就還有事情要做。這么做主要是為了創(chuàng)建連接,它不會(huì)等待完整的URL響應(yīng)。
  4. 只要批處理中還有活動(dòng)連接主循環(huán)就會(huì)一直持續(xù)。
  5. curl_multi_select() 會(huì)一直等待,直到某個(gè)URL查詢產(chǎn)生活動(dòng)連接。
  6. cURL的活兒又來(lái)了,主要是獲取響應(yīng)數(shù)據(jù)。
  7. 檢查各種信息。當(dāng)一個(gè)URL請(qǐng)求完成時(shí),會(huì)返回一個(gè)數(shù)組。
  8. 在返回的數(shù)組中有一個(gè) cURL 句柄。我們利用其獲取單個(gè)cURL請(qǐng)求的相應(yīng)信息。
  9. 如果這是一個(gè)死鏈或者請(qǐng)求超時(shí),不會(huì)返回http狀態(tài)碼。
  10. 如果這個(gè)頁(yè)面找不到了,會(huì)返回404狀態(tài)碼。
  11. 其他情況我們都認(rèn)為這個(gè)鏈接是可用的(當(dāng)然,你也可以再檢查一下500錯(cuò)誤之類(lèi)...)。
  12. 從該批次移除這個(gè)cURL句柄,因?yàn)樗呀?jīng)沒(méi)有利用價(jià)值了,關(guān)了它!
  13. 很好,現(xiàn)在可以另外加一個(gè)URL進(jìn)來(lái)了。再一次地,初始化工作又開(kāi)始進(jìn)行...
  14. 嗯,該干的都干了。關(guān)閉批處理器,生成報(bào)告。
  15. 回過(guò)頭來(lái)看給批處理器添加新URL的函數(shù)。這個(gè)函數(shù)每調(diào)用一次,靜態(tài)變量 $index 就遞增一次,這樣我們才能知道還剩多少URL沒(méi)處理。

我把這個(gè)腳本在我的博客上跑了一遍(測(cè)試需要,有一些錯(cuò)誤鏈接是故意加上的),結(jié)果如下:

<img border="0" src="http://files.jb51.NET/upload/201106/20110602225008534.png" />

共檢查約40個(gè)URL,只耗費(fèi)兩秒不到。當(dāng)需要檢查更加大量的URL時(shí),其省心省力的效果可想而知!如果你同時(shí)打開(kāi)10個(gè)連接,還能再快上10倍!另外,你還可以利用cURL批處理的無(wú)隔斷特性來(lái)處理大量URL請(qǐng)求,而不會(huì)阻塞你的Web腳本。

另一些有用的cURL 選項(xiàng)

HTTP 認(rèn)證

如果某個(gè)URL請(qǐng)求需要基于 HTTP 的身份驗(yàn)證,你可以使用下面的代碼:
復(fù)制內(nèi)容到剪貼板代碼:

$url = "http://www.somesite.com/members/";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 發(fā)送用戶名和密碼
curl_setopt($ch, CURLOPT_USERPWD, "myusername:mypassword");
// 你可以允許其重定向
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
// 下面的選項(xiàng)讓 cURL 在重定向后
// 也能發(fā)送用戶名和密碼
curl_setopt($ch, CURLOPT_UNRESTRICTED_AUTH, 1);
$output = curl_exec($ch);
curl_close($ch);

FTP 上傳

php 自帶有 FTP 類(lèi)庫(kù), 但你也能用 cURL:

// 開(kāi)一個(gè)文件指針
$file = fopen("/path/to/file", "r");
// url里包含了大部分所需信息
$url = "ftp://username:password@mydomain.com:21/path/to/new/file";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 上傳相關(guān)的選項(xiàng)
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize("/path/to/file"));
// 是否開(kāi)啟ASCII模式 (上傳文本文件時(shí)有用)
curl_setopt($ch, CURLOPT_FTPASCII, 1);
$output = curl_exec($ch);
curl_close($ch);

翻墻術(shù)

你可以用代理發(fā)起cURL請(qǐng)求:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://www.example.com');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// 指定代理地址
curl_setopt($ch, CURLOPT_PROXY, '11.11.11.11:8080');
// 如果需要的話,提供用戶名和密碼
curl_setopt($ch, CURLOPT_PROXYUSERPWD,'user:pass');
$output = curl_exec($ch);
curl_close ($ch);

回調(diào)函數(shù)

可以在一個(gè)URL請(qǐng)求過(guò)程中,讓cURL調(diào)用某指定的回調(diào)函數(shù)。例如,在內(nèi)容或者響應(yīng)下載的過(guò)程中立刻開(kāi)始利用數(shù)據(jù),而不用等到完全下載完。

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,'http://NET.tutsplus.com');
curl_setopt($ch, CURLOPT_WRITEFUNCTION,"progress_function");
curl_exec($ch);
curl_close ($ch);
function progress_function($ch,$str) {
    echo $str;
    return strlen($str);
}

這個(gè)回調(diào)函數(shù)必須返回字串的長(zhǎng)度,不然此功能將無(wú)法正常使用。

在URL響應(yīng)接收的過(guò)程中,只要收到一個(gè)數(shù)據(jù)包,這個(gè)函數(shù)就會(huì)被調(diào)用。

小結(jié)

今天我們一起學(xué)習(xí)了cURL庫(kù)的強(qiáng)大功能和靈活的擴(kuò)展性。希望你喜歡。下一次要發(fā)起URL請(qǐng)求時(shí),考慮下cURL吧!

原文:基于php的cURL快速入門(mén)

英文原文:http://NET.tutsplus.com/tutorial%20...%20for-mastering-curl/

原文作者:Burak Guzel

php技術(shù)基于PHP的cURL快速入門(mén)教程 (小偷采集程序),轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 河北区| 景洪市| 东至县| 毕节市| 古蔺县| 德清县| 林周县| 伊宁县| 长宁县| 韩城市| 彰化县| 汾阳市| 视频| 英山县| 平武县| 罗田县| 定结县| 连平县| 莆田市| 翼城县| 黔南| 晋宁县| 庐江县| 塘沽区| 重庆市| 云霄县| 天全县| 长岭县| 凤冈县| 沙田区| 湖北省| 维西| 太仆寺旗| 宜州市| 体育| 宜兰市| 彰化县| 榆林市| 临夏市| 贞丰县| 天柱县|