平时使用 php curl 获取远程数据的情况很常见,各种 API 的调用。

但是批量获取的时候 不太多见 (采集除外)。但是多线程的 好处很明显的,10个链接同时去请求,使用时间缩短到原来的 1/10 [不是特别严谨]。

下面是使用 PHP Curl 多线程的代码,当然官方手册都有,这儿只是做个记录

<?php

$url = 'http://rss.sina.com.cn/tech/internet/home28.xml';

// 获取新浪新闻 订阅列表 并匹配出 链接地址
$html = file_get_contents($url);
$urls = preg_match_all('#<link>http://go\.rss\.sina\.com\.cn/redirect\.php\?url=(.+?)</link>#i', $html, $urls)
    ? $urls[1]
    : [];


// 开始时间
$startTime = microtime(true);


// curl 批处理
$mh = curl_multi_init();

// 保存单个句柄
$handles = [];


// 向 curl 批处理会话 中添加单独的 curl句柄
foreach($urls as $k => $url){
    $handles[$k] = getCurl($url);
    curl_multi_add_handle($mh, $handles[$k]);
}


$active = null;
// 执行 curl 批处理会话
do {
    $mrc = curl_multi_exec($mh, $active);
} while ($active);



// 循环输出 大小以及地址
foreach($handles as $handle){
    $info = curl_getinfo($handle);
    curl_multi_remove_handle($mh, $handle);
    echo "Size: {$info['size_download']}  Url: {$info['url']}" . PHP_EOL;
}

curl_multi_close($mh);


// 计算用时
$time = round(microtime(true) - $startTime, 4);

$count = count($urls);

echo "Count: $count\r\n";
echo "Time: $time s\r\n";





// 返回单个 curl 句柄
function getCurl($url){
    $c = curl_init();
    curl_setopt($c, CURLOPT_URL, $url);
    curl_setopt($c, CURLOPT_HEADER, false);
    curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
    return $c;
}


 

 

下面的地图的生成,就用到了 curl 多线程