首页 >php教程 >php手册 >php file_get_contents与curl()函数对比

php file_get_contents与curl()函数对比

WBOY
WBOY原创
2016-06-13 09:47:571095浏览

在php中file_get_contents与curl()函数都可以用来抓取对方网站的数据并保存到本地服务器中,但是总得来讲file_get_contents()效率稍低些,常用失败的情况、curl()效率挺高的,支持多线程,不过需要开启下curl扩展,也就是说要使用curl函数就必须要打开curl扩展了,而file_get_contents函数系统是默认的哦。

下面是curl扩展开启的步骤:

1、将PHP文件夹下的三个文件php_curl.dll,libeay32.dll,ssleay32.dll复制到system32下;
2、将php.ini(c:WINDOWS目录下)中的;extension=php_curl.dll中的分号去掉;

3、重启apache或者IIS。

我们先来看看两个函数的简单实例

curl()函数

 代码如下 复制代码
 代码如下 复制代码

$ch = curl_init("http://www.bKjia.c0m/");
curl_exec($ch);
curl_close($ch);

//$ch = curl_init("要采集的网址");  curl_init()函数的作用初始化一个curl会话

//curl_exec($ch);执行$ch

//curl_close($ch); 关闭$ch

$ch = curl_init("http://www.bKjia.c0m/");

curl_exec($ch); curl_close($ch);

//$ch = curl_init("要采集的网址");  curl_init()函数的作用初始化一个curl会话

//curl_exec($ch);执行$ch
 代码如下 复制代码
echo file_get_contents("http://www.hzhuti.com");
?>

//curl_close($ch); 关闭$ch

 代码如下 复制代码

This is a test file with test text.

file_get_contents函数

例子

 代码如下 复制代码
echo file_get_contents("http://www.hzhuti.com");
?>
输出:

 代码如下 复制代码

This is a test file with test text.
总结
 代码如下 复制代码

$config['context'] = stream_context_create(array('http' => array('method' => "GET",'timeout' => 5))); 


fopen / file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存。

但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS查询。这大大减少了DNS查询的次数。
 代码如下 复制代码
file_get_contents(http://***): failed to open stream… 
所以CURL的性能比fopen / file_get_contents 好很多。 file_get_contents与curl效率及稳定性问题
 代码如下 复制代码
$config['context'] = stream_context_create(array('http' => array('method' => "GET",'timeout' => 5))); 
  'timeout' => 5//这个超时时间不稳定,经常不好使。这时候,看一下服务器的连接池,会发现一堆类似下面的错误,让你头疼万分:

 

不得已,安装了curl库,写了一个函数替换:

   curl_setopt($ch, CURLOPT_REFERER,_REFERER_);        //设置 referer       curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);      //跟踪301  
 代码如下
 代码如下 复制代码

function curl_get_contents($url)  
{  
   $ch = curl_init();  
   curl_setopt($ch, CURLOPT_URL, $url);            //设置访问的url地址  
   //curl_setopt($ch,CURLOPT_HEADER,1);            //是否显示头部信息  
   curl_setopt($ch, CURLOPT_TIMEOUT, 5);           //设置超时  
   curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);   //用户访问代理 User-Agent  
   curl_setopt($ch, CURLOPT_REFERER,_REFERER_);        //设置 referer  
    curl_setopt($ch,CURLOPT_FOLLOWLOCATION,1);      //跟踪301  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果  
    $r = curl_exec($ch);  
    curl_close($ch);  
    return $r;  

复制代码



function curl_get_contents($url)   {  
 代码如下 复制代码

1.2.31319094  
2.2.30374217  
3.2.21512604  
4.3.30553889  
5.2.30124092 

curl使用的时间:

1.0.68719101  
2.0.64675593  
3.0.64326  
4.0.81983113  
5.0.63956594 

   $ch = curl_init();  

   curl_setopt($ch, CURLOPT_URL, $url);            //设置访问的url地址  
   //curl_setopt($ch,CURLOPT_HEADER,1);            //是否显示头部信息  

   curl_setopt($ch, CURLOPT_TIMEOUT, 5);           //设置超时  
 代码如下 复制代码

< ?php
function vita_get_url_content($url) {
if(function_exists('file_get_contents')) {
$file_contents = file_get_contents($url);
} else {
$ch = curl_init();
$timeout = 5;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
$file_contents = curl_exec($ch);
curl_close($ch);
}
return $file_contents;
}
?>

   curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);   //用户访问代理 User-Agent  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);        //返回结果       $r = curl_exec($ch);       curl_close($ch);       return $r;   }  如此,除了真正的网络问题外,没再出现任何问题。 这是别人做过的关于curl和file_get_contents的测试: file_get_contents抓取google.com需用秒数:
 代码如下 复制代码
1.2.31319094   2.2.30374217   3.2.21512604   4.3.30553889   5.2.30124092  curl使用的时间: 1.0.68719101   2.0.64675593   3.0.64326   4.0.81983113   5.0.63956594  那么如何根据服务器情况来使用file_get_contents还是curl()呢,下面我们可以利用function_exists函数来判断php是否支持一个函数可以轻松写出下面函数
 代码如下 复制代码
< ?php <🎜>  function vita_get_url_content($url) { <🎜>  if(function_exists('file_get_contents')) { <🎜>  $file_contents = file_get_contents($url); <🎜>  } else { <🎜>  $ch = curl_init(); <🎜>  $timeout = 5;  <🎜>  curl_setopt ($ch, CURLOPT_URL, $url); <🎜>  curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);  <🎜>  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout); <🎜>  $file_contents = curl_exec($ch); <🎜>  curl_close($ch); <🎜>  } <🎜>  return $file_contents; <🎜>  } <🎜>  ?>
声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn