国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

解讀PHP如何使用 CURL 同步抓取多個(gè)網(wǎng)頁

2024-05-04 21:52:32
字體:
供稿:網(wǎng)友

一般CURL 抓網(wǎng)頁的方法, 是一頁一頁抓, 假設(shè)要抓 4頁, 所費(fèi)時(shí)間各別是 5,10,7,5 秒, 那全部總合所花的時(shí)間就是 5 + 10 + 7 + 5 = 27 秒。若能同時(shí)間去抓取多個(gè)網(wǎng)頁, 所花費(fèi)的時(shí)間 5,10,7,5 秒, 全部總合所花的時(shí)間是 10 秒。(花費(fèi)最多時(shí)間的秒數(shù))于JavaScript 可使用 AJAX 的 async(YAHOO.util.Connect.asyncRequest)來達(dá)成, 于 PHP 可以用 CURL 來達(dá)成此 Multi-Threading 的效果。程序(async.php)

以下為引用的內(nèi)容:
<?php
function async_get_url($url_array, $wait_usec = 0)
{
    if (!is_array($url_array))
        return false;

    $wait_usec = intval($wait_usec);

    $data    = array();
    $handle  = array();
    $running = 0;

    $mh = curl_multi_init(); // multi curl handler

    $i = 0;
    foreach($url_array as $url) {
        $ch = curl_init();

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
        curl_setopt($ch, CURLOPT_MAXREDIRS, 7);

        curl_multi_add_handle($mh, $ch); // 把 curl resource 放進(jìn) multi curl handler 里

        $handle[$i++] = $ch;
    }

    /* 執(zhí)行 */
    do {
        curl_multi_exec($mh, $running);

        if ($wait_usec > 0) /* 每個(gè) connect 要間隔多久 */
            usleep($wait_usec); // 250000 = 0.25 sec
    } while ($running > 0);

    /* 讀取資料 */
    foreach($handle as $i => $ch) {
        $content  = curl_multi_getcontent($ch);
        $data[$i] = (curl_errno($ch) == 0) ? $content : false;
    }

    /* 移除 handle*/
    foreach($handle as $ch) {
        curl_multi_remove_handle($mh, $ch);
    }

    curl_multi_close($mh);

    return $data;
}
?>

使用

以下為引用的內(nèi)容:
<?php
$urls = array('http://example1.com', 'http://example2.com');
print_r(async_get_url($urls)); // [0] => example1, [1] => example2
?>

測試

sleep.php # 看時(shí)間延長取得的效果

以下為引用的內(nèi)容:
<?php
sleep(intval($_GET['time']));
echo intval($_GET['time']);
?>

以下為引用的內(nèi)容:
<?php
$url_array = array(
        'http://example.com/sleep.php?time=5',
        'http://example.com/sleep.php?time=10',
        'http://example.com/sleep.php?time=7',
        'http://example.com/sleep.php?time=5',
        );
print_r(async_get_url($url_array));
// 總花費(fèi)時(shí)間會(huì)是 10 秒, 并印出 [0] => 5, [1] => 10, [2] => 7, [3] => 5
?>

 

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 开封市| 云和县| 怀安县| 西城区| 曲靖市| 且末县| 临安市| 迁西县| 明光市| 沁水县| 湘潭市| 增城市| 库车县| 达拉特旗| 二连浩特市| 湘西| 建湖县| 锡林浩特市| 唐海县| 宣城市| 曲松县| 长岛县| 南部县| 吴桥县| 商都县| 剑川县| 盐山县| 安新县| 新竹县| 千阳县| 饶平县| 中方县| 海口市| 北海市| 大田县| 惠州市| 长阳| 合阳县| 青川县| 北流市| 扶沟县|