curl模拟多线程,传入一维数组url
/**
* curl模拟多线程
*
* @access public
* @author 2017.4
* @param array
* @return array
*/
function getCurlObject($urls = array()){
$queue = curl_multi_init(); //允许并行地处理批处理cURL句柄。
foreach($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //这个curl只是说明了它是要干嘛,但是一直到 curl_multi_add_handle 都啥也没有去干,也就是说没有去模拟访问
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 65000);//超时
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0'); //指明你的浏览器,这是我的
//curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookie); // 如果是需要登陆才能采集的话,需要加上你登陆后得到的cookie文件
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($queue,$ch); //向批处理句柄中,添加句柄 后面批量的去模拟访问,抓取回资源
//$curlInfo[] = curl_getinfo($ch);
}
$responses = array(); //声名一个数组
do{
while(($code = curl_multi_exec($queue,$active)) == CURLM_CALL_MULTI_PERFORM); //返回值如果是0,那就得继续
}while($active); //一直到资源里还有0条为止
//经过了刚才的循环指抓取 此时 $queue 就是一个批量的资源集了
$i=0;
while($done = curl_multi_info_read($queue)){// 用这个专门读取批量资源集的函数,可以把这个资源集的内容一条条的读出来
$info = curl_getinfo($done['handle']);
//$responses[$i]['content'] = curl_multi_getcontent($done['handle']);
//要读取资源集的资源条抓取回来的内容,还得用专门的curl_multi_getcontent函数才能完成
$responses[$i]['content'] = mb_convert_encoding(curl_multi_getcontent($done['handle']), 'utf-8', 'GBK,UTF-8,ASCII');
curl_multi_remove_handle($queue,$done['handle']); //读取了资源,别忘记把该资源从资源集中移除
curl_close($done['handle']); //也别忘记把这个资源句柄关闭,减小内存开销
$responses[$i]['url'] = $info['url'];
$i++;
}
curl_multi_close($queue); //总句柄关闭
return $responses;
}
/**
* curl模拟多线程
*
* @access public
* @author 2017.4
* @param array
* @return array
*/
function getCurlObject($urls = array()){
$queue = curl_multi_init(); //允许并行地处理批处理cURL句柄。
foreach($urls as $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url); //这个curl只是说明了它是要干嘛,但是一直到 curl_multi_add_handle 都啥也没有去干,也就是说没有去模拟访问
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_TIMEOUT, 65000);//超时
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; rv:21.0) Gecko/20100101 Firefox/21.0'); //指明你的浏览器,这是我的
//curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_cookie); // 如果是需要登陆才能采集的话,需要加上你登陆后得到的cookie文件
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOSIGNAL, true);
curl_multi_add_handle($queue,$ch); //向批处理句柄中,添加句柄 后面批量的去模拟访问,抓取回资源
//$curlInfo[] = curl_getinfo($ch);
}
$responses = array(); //声名一个数组
do{
while(($code = curl_multi_exec($queue,$active)) == CURLM_CALL_MULTI_PERFORM); //返回值如果是0,那就得继续
}while($active); //一直到资源里还有0条为止
//经过了刚才的循环指抓取 此时 $queue 就是一个批量的资源集了
$i=0;
while($done = curl_multi_info_read($queue)){// 用这个专门读取批量资源集的函数,可以把这个资源集的内容一条条的读出来
$info = curl_getinfo($done['handle']);
//$responses[$i]['content'] = curl_multi_getcontent($done['handle']);
//要读取资源集的资源条抓取回来的内容,还得用专门的curl_multi_getcontent函数才能完成
$responses[$i]['content'] = mb_convert_encoding(curl_multi_getcontent($done['handle']), 'utf-8', 'GBK,UTF-8,ASCII');
curl_multi_remove_handle($queue,$done['handle']); //读取了资源,别忘记把该资源从资源集中移除
curl_close($done['handle']); //也别忘记把这个资源句柄关闭,减小内存开销
$responses[$i]['url'] = $info['url'];
$i++;
}
curl_multi_close($queue); //总句柄关闭
return $responses;
}