首页 > 开发 > PHP > 正文

php使用curl_init()和curl_multi_init()多线程的速度比较详解

2024-05-04 22:42:23
字体:
来源:转载
供稿:网友

本文实例讲述了php使用curl_init()和curl_multi_init()多线程的速度比较。分享给大家供大家参考,具体如下:

php中curl_init()的作用很大,尤其是在抓取网页内容或文件信息的时候,例如之前文章《php使用curl获取header检测开启GZip压缩》就介绍到curl_init()的强大。

curl_init()处理事物是单线程模式,如果需要对事务处理走多线程模式,那么php里提供了一个函数curl_multi_init()给我们,这就是多线程模式处理事务的函数。

curl_init()curl_multi_init()的速度比较

curl_multi_init()多线程能提高网页的处理速度吗?今天我通过实验来验证一下这个问题。

今天我的测试很简单,那就是要抓取www.webkaka.com网页的内容,要连续抓5次,分别用curl_init()curl_multi_init()函数来完成,记录两者的耗时,比较得出结论。

首先,用curl_init()单线程连续抓5次www.webkaka.com网页的内容。

程序代码如下:

<?php$mtime = explode(" ", microtime());$mtime = $mtime[1].($mtime[0] * 1000);$mtime2 = explode(".", $mtime);$mtime = $mtime2[0];echo $mtime;echo "<br>";for($i=1; $i<=5; $i++){$szUrl = 'http://www.webkaka.com/';$curl = curl_init();curl_setopt($curl, CURLOPT_URL, $szUrl);curl_setopt($curl, CURLOPT_HEADER, 0);curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);curl_setopt($curl, CURLOPT_ENCODING, '');$data=curl_exec($curl);echo $data;echo "<br>";$mtime_ = explode(" ", microtime());$mtime_ = $mtime_[1].($mtime_[0] * 1000);$mtime2_ = explode(".", $mtime_);$mtime_ = $mtime2_[0];echo $mtime_;echo "<br>";echo $mtime_ - $mtime;}?>

然后,用curl_multi_init()多线程连续抓5次www.webkaka.com网页的内容。

代码如下:

<?phpecho date("Y-m-d H:m:s",time());echo " ";echo floor(microtime()*1000);echo "<br>";$mtime = explode(" ", microtime());$mtime = $mtime[1].($mtime[0] * 1000);$mtime2 = explode(".", $mtime);$mtime = $mtime2[0];echo $mtime;echo "<br>";$urls = array('http://www.webkaka.com','http://www.webkaka.com','http://www.webkaka.com','http://www.webkaka.com','http://www.webkaka.com');print_r(async_get_url($urls)); // [0] => example1, [1] => example2echo "<br>";echo date("Y-m-d H:m:s",time());echo " ";echo floor(microtime()*1000);echo "<br>";$mtime_ = explode(" ", microtime());$mtime_ = $mtime_[1].($mtime_[0] * 1000);$mtime2_ = explode(".", $mtime_);$mtime_ = $mtime2_[0];echo $mtime_;echo "<br>";echo $mtime_ - $mtime;function async_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(); // multi curl handler  $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 resource 放进 multi curl handler 里    $handle[$i++] = $ch;  }  /* 执行 */  do {    curl_multi_exec($mh, $running);    if ($wait_usec > 0) /* 每个 connect 要间隔多久 */      usleep($wait_usec); // 250000 = 0.25 sec  } while ($running > 0);  /* 读取资料 */  foreach($handle as $i => $ch) {    $content = curl_multi_getcontent($ch);    $data[$i] = (curl_errno($ch) == 0) ? $content : false;  }  /* 移除 handle*/  foreach($handle as $ch) {    curl_multi_remove_handle($mh, $ch);  }  curl_multi_close($mh);  return $data;}?>            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表