博主辛苦了,我要打赏银两给博主,犒劳犒劳站长。
【摘要】curl_init() 处理事物是单线程模式,如果需要对事务处理走多线程模式,那么 php 里提供了一个函数 curl_multi_init() 给我们,这就是多线程模式处理事务的函数,本文比较一下 PHP 中使用单线程和多线程抓取页面的速度的比较。
我们要抓取 http://www.mafutian.net 网页中的内容,要连续抓 100 次,比较两种方式的执行时间,下面是完整的源代码,可直接复制到 PHP 文件中执行即可:
// 要抓取的网页
$szurl = 'http://www.mafutian.net';
$count = 100; // 抓取次数
echo '单线程和多线程抓取网页 '.$szurl.' '.$count.'次的时间分别是:<br />';
// =========== 采用单线程方法抓取页面的时间 BEGIN =========== //
$begin_time = getMicrotime();
for($i = 1; $i <= $count; $i++)
{
signle_get_url($szurl);
}
$end_time = getMicrotime();
echo '单线程:'.($end_time - $begin_time).'秒';
echo '<br />';
// =========== 采用单线程方法抓取页面的时间 END =========== //
// =========== 采用多线程方法抓取页面的时间 BEGIN =========== //
$urls = array();
for($i = 1;$i <= $count;$i++)
{
array_push($urls,$szurl);
}
$begin_time = getMicrotime();
multi_get_url($urls);
$end_time = getMicrotime();
echo '多线程:'.($end_time - $begin_time).'秒';
echo '<br />';
// =========== 采用多线程方法抓取页面的时间 END =========== //
// 获取当前的时间戳(含微秒)
function getMicrotime()
{
list($usec,$sec) = explode(" ",microtime());
return ((float)$sec + (float)$usec);
}
// curl_init() 单线程抓取页面:signle_get_url()
function signle_get_url($url)
{
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_ENCODING, '');
$data = curl_exec($curl);
return $data;
}
// curl_multi_init() 多线程抓取:multi_get_url()
function multi_get_url($url_array, $wait_usec = 0)
{
if (!is_array($url_array))
{
return false;
}
$wait_usec = intval($wait_usec);
$data = array();
$handle = array();
$running = 0;
$mh = curl_multi_init(); // 返回一个新 cURL 批处理句柄
$i = 0;
foreach($url_array as $url)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return don't print
curl_setopt($ch, CURLOPT_TIMEOUT, 30);
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // 302 redirect
curl_setopt($ch, CURLOPT_MAXREDIRS, 7);
curl_multi_add_handle($mh, $ch); // 向 curl 批处理会话中添加单独的 curl 句柄
$handle[$i++] = $ch;
}
do{
// 运行当前 cURL 句柄的子连接
curl_multi_exec($mh, $running);
if($wait_usec > 0)
{
usleep($wait_usec);
}
}while($running > 0);
foreach($handle as $i => $ch)
{
// 如果设置了CURLOPT_RETURNTRANSFER,则返回获取的输出的文本流
$content = curl_multi_getcontent($ch);
$data[$i] = (curl_errno($ch) == 0) ? $content : false;
}
/* 移除 handle*/
foreach($handle as $ch)
{
// 移除 curl 批处理句柄资源中的某个句柄资源
curl_multi_remove_handle($mh, $ch);
}
// 关闭 cURL 句柄
curl_multi_close($mh);
return $data;
}
执行结果如图:
单线程和多线程抓取网页 http://www.mafutian.net 100次的时间分别是:
单线程:21.258215904236秒
多线程:3.6812100410461秒
由此可见,多线程所花费的时间远比单线程耗时短。
版权归 马富天博客 所有
本文标题:《PHP 中 curl_init() 单线程和 curl_multi_init() 多线程抓取页面的速度比较》
本文链接地址:http://www.mafutian.net/217.html
转载请务必注明出处,小生将不胜感激,谢谢! 喜欢本文或觉得本文对您有帮助,请分享给您的朋友 ^_^
顶0
踩0