所属分类:PHP工具与代码
八、 多线程采集
对于大量采集工作,为了提高采集效率,使用PHP cURL提供的多线程采集是必不可少的。手册上提供的多线程采集例子好像都不太好用,我刚开始也从里面测试了几个例子,但是发现都是执行卡死,根本无法执行完成,前几天突然又测试了一下,然后发现curl_multi_info_read函数下面的Example #1是可以执行的,它的内容在$res上,但是没有打印出来,而且雅虎的请求比较慢,会卡住,前面两个链接都能正常返回。
不过,
还好当时的例子不好用,然后我经过搜索找到了一个很厉害的项目,CurlMulti
https://github.com/ares333/php-curlmulti
,它对PHP cURL Multi 进行了一个良性扩展的封装,能够很好地提供采集支持。
关于CurlMulti的使用我就不多介绍,官网上面提供了demo,使用过程有技术难题可以直接加入Q群( cURL高级技术 215348766 )讨论,作者@Ares 和其他的采集大牛都会提供技术解答帮助。
下面是PHP cURL Multi的一个简单示例:
[code] $urls = array(
array(
'url' => 'http://demo.zjmainstay.cn/php/curl/curl_multi_1.php',
'id' => 1,
),
array(
'url' => 'http://demo.zjmainstay.cn/php/curl/curl_multi_2.php',
'id' => 2,
),
);
$mh = curl_multi_init();
$conn = array();
foreach ($urls as $urlItem) {
$ch = curl_init($urlItem['url']);
$conn[(int)$ch] = $urlItem; //记录资源与参数映射
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //不直接输出结果
curl_multi_add_handle($mh, $ch);
}
$active = null;
$res = array();
do {
$status = curl_multi_exec($mh, $active);
$info = curl_multi_info_read($mh);
if (false !== $info) {
//采集信息处理
$res[] = array(
'content' => curl_multi_getcontent($info['handle']),
'info' => $info,
'param' => $conn[(int)$info['handle']],
);
curl_close($info['handle']);
}
} while ($status === CURLM_CALL_MULTI_PERFORM || $active);
curl_multi_close($mh);
var_dump($res);[/code]
对于大量采集工作,为了提高采集效率,使用PHP cURL提供的多线程采集是必不可少的。手册上提供的多线程采集例子好像都不太好用,我刚开始也从里面测试了几个例子,但是发现都是执行卡死,根本无法执行完成,前几天突然又测试了一下,然后发现curl_multi_info_read函数下面的Example #1是可以执行的,它的内容在$res上,但是没有打印出来,而且雅虎的请求比较慢,会卡住,前面两个链接都能正常返回。
不过,
还好当时的例子不好用,然后我经过搜索找到了一个很厉害的项目,CurlMulti
https://github.com/ares333/php-curlmulti
,它对PHP cURL Multi 进行了一个良性扩展的封装,能够很好地提供采集支持。
关于CurlMulti的使用我就不多介绍,官网上面提供了demo,使用过程有技术难题可以直接加入Q群( cURL高级技术 215348766 )讨论,作者@Ares 和其他的采集大牛都会提供技术解答帮助。
下面是PHP cURL Multi的一个简单示例:
[code] $urls = array(
array(
'url' => 'http://demo.zjmainstay.cn/php/curl/curl_multi_1.php',
'id' => 1,
),
array(
'url' => 'http://demo.zjmainstay.cn/php/curl/curl_multi_2.php',
'id' => 2,
),
);
$mh = curl_multi_init();
$conn = array();
foreach ($urls as $urlItem) {
$ch = curl_init($urlItem['url']);
$conn[(int)$ch] = $urlItem; //记录资源与参数映射
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //不直接输出结果
curl_multi_add_handle($mh, $ch);
}
$active = null;
$res = array();
do {
$status = curl_multi_exec($mh, $active);
$info = curl_multi_info_read($mh);
if (false !== $info) {
//采集信息处理
$res[] = array(
'content' => curl_multi_getcontent($info['handle']),
'info' => $info,
'param' => $conn[(int)$info['handle']],
);
curl_close($info['handle']);
}
} while ($status === CURLM_CALL_MULTI_PERFORM || $active);
curl_multi_close($mh);
var_dump($res);[/code]