php+curlmultiinit_curl_multi_init Curl 多线程的使用

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

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

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

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

// 获取新浪新闻 订阅列表 并匹配出 链接地址

$html = file_get_contents($url);

$urls = preg_match_all('#http://go\.rss\.sina\.com\.cn/redirect\.php\?url=(.+?)#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 多线程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值