好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

php file_get_contents与curl()函数对比 - php函数

php file_get_contents与curl()函数对比

在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://HdhCmsTestphpfensi测试数据/" );  curl_exec( $ch );  curl_close( $ch );  //$ch = curl_init("要采集的网址");  curl_init()函数的作用初始化一个curl会话   //curl_exec($ch);执行$ch   //curl_close($ch); 关闭$ch  

file_get_contents函数,代码如下:

<?php  echo   file_get_contents ( "http://HdhCmsTestphpfensi测试数据" );  ?>  //输出:This is a test file with test text.  

总结: fopen / file_get_contents 每次请求都会重新做DNS查询,并不对DNS信息进行缓存,但是CURL会自动对DNS信息进行缓存,对同一域名下的网页或者图片的请求只需要一次DNS查询,这大大减少了DNS查询的次数,所以CURL的性能比fopen / file_get_contents 好很多。

file_get_contents与curl效率及稳定性问题, 代码如下:

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

这个超时时间不稳定,经常不好使,这时候,看一下服务器的连接池,会发现一堆类似下面的错误,让你头疼万分,代码如下:

file_get_contents(http://***): failed to open stream… 

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

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 ;     }  

如此,除了真正的网络问题外,没再出现任何问题,这是别人做过的关于curl和file_get_contents的测试,file_get_contents抓取google测试数据需用秒数,代码如下:

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   

那么如何根据服务器情况来使用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 ;    }    ?> 

查看更多关于php file_get_contents与curl()函数对比 - php函数的详细内容...

  阅读:34次