在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库,写了一个函数替换:
代码如下
代码如下 |
复制代码 |
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_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.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; <🎜>
} <🎜>
?>
|
|