平时使用 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);
// 内容
$content = curl_multi_getcontent($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 多线程