PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题


Posted in PHP onNovember 30, 2015

PHP CURL与file_get_contents函数都可以获取远程服务器上的文件保存到本地,但在性能上面两者完全不在同一个级别,下面我先来介绍PHP CURL或file_get_contents函数应用例子,然后再简单的给各位介绍一下它们的一些小区别吧。

推荐方法 CURL获取

<?php
$c = curl_init();
$url = '3water.com';
curl_setopt($c, CURLOPT_URL, $url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec($c);
curl_close($c);
$pos = strpos($data,'utf-8');
if($pos===false){$data = iconv("gbk","utf-8",$data);}
preg_match("/<title>(.*)<\/title>/i",$data, $title);
echo $title[1];
?>

使用file_get_contents

<?php
$content=file_get_contents("https://3water.com/");
$pos = strpos($content,'utf-8');
if($pos===false){$content = iconv("gbk","utf-8",$content);}
$postb=strpos($content,'<title>')+7;
$poste=strpos($content,'</title>');
$length=$poste-$postb;
echo substr($content,$postb,$length);
?>

看看file_get_contents性能

1)fopen/file_get_contents 每次请求远程URL中的数据都会重新做DNS查询,并不对DNS信息进行缓存。但是CURL会自动对DNS信息进行缓存。对同一域名下的网页或者图片的请求只需要一次DNS 查询。这大大减少了DNS查询的次数。所以CURL的性能比fopen/file_get_contents 好很多。
2)fopen/file_get_contents在请求HTTP时,使用的是http_fopen_wrapper,不会keeplive。而curl却可以。这样在多次请求多个链接时,curl效率会好一些。(设置header头应该可以)
3)fopen/file_get_contents函数会受到php.ini文件中allow_url_open选项配置的影响。如果该配置关闭了,则该函数也就失效了。而curl不受该配置的影响。
4)curl可以模拟多种请求,例如:POST数据,表单提交等,用户可以按照自己的需求来定制请求。而fopen/file_get_contents只能使用get方式获取数据。
5)fopen/file_get_contents 不能正确下载二进制文件
6)fopen/file_get_contents 不能正确处理ssl请求
7)curl 可以利用多线程
8)使用 file_get_contents 的时候如果 网络出现问题, 很容易堆积一些进程在这里
9)如果是要打一个持续连接,多次请求多个页面。那么file_get_contents就会出问题。取得的内容也可能会不对。所以做一些类似采集工作的时候,肯定就有问题了。对做采集抓取的用curl,如果还有同不相信下面我们再做个测试

curl与file_get_contents性能对比PHP源代码如下:

1829.php

<?php
/**
* 通过淘宝IP接口获取IP地理位置
* @param string $ip
* @return: string
**/
function getCityCurl($ip)
{
 $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
 $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);
 $ipinfo=json_decode($file_contents);
 if($ipinfo->code=='1'){
  return false;
 }
 $city = $ipinfo->data->region.$ipinfo->data->city;
 return $city;
}
function getCity($ip)
{
 $url="http://ip.taobao.com/service/getIpInfo.php?ip=".$ip;
 $ipinfo=json_decode(file_get_contents($url));
 if($ipinfo->code=='1'){
  return false;
 }
 $city = $ipinfo->data->region.$ipinfo->data->city;
 return $city;
}
// for file_get_contents
$startTime=explode(' ',microtime());
$startTime=$startTime[0] + $startTime[1];
for($i=1;$i<=10;$i++)
{
 echo getCity("121.207.247.202")."</br>";
}
$endTime = explode(' ',microtime());
$endTime = $endTime[0] + $endTime[1];
$totalTime = $endTime - $startTime;
echo 'file_get_contents:'.number_format($totalTime, 10, '.', "")." seconds</br>";
//for curl
$startTime2=explode(' ',microtime());
$startTime2=$startTime2[0] + $startTime2[1];
for($i=1;$i<=10;$i++)
{
 echo getCityCurl('121.207.247.202')."</br>";
}
$endTime2 = explode(' ',microtime());
$endTime2=$endTime2[0] + $endTime2[1];
$totalTime2 = $endTime2 - $startTime2;
echo "curl:".number_format($totalTime2, 10, '.', "")." seconds";
?>

测试访问

file_get_contents速度:4.2404510975 seconds
curl速度:2.8205530643 seconds
curl比file_get_contents速度快了30%左右,最重要的是服务器负载更低.

ps:php函数file_get_contents与curl效率及稳定性问题

习惯了使用方便快捷的file_get_contents函数抓取别家网站内容,但是总是会遇到获取失败的问题,尽管按照手册中的例子设置了超时,可多数时候不好使:

$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.com需用秒数:

2.31319094  
2.30374217  
2.21512604  
3.30553889  
2.30124092 

curl使用的时间:

0.68719101  
0.64675593  
0.64326  
0.81983113  
0.63956594 

差距很大吧?呵呵,从我使用的经验来说,这两个工具不只是速度有差异,稳定性也相差很大。建议对网络数据抓取稳定性要求比较高的朋友使用上面的 curl_file_get_contents函数,不但稳定速度快,还能假冒浏览器欺骗目标地址哦!

PHP 相关文章推荐
通过对php一些服务器端特性的配置加强php的安全
Oct 09 PHP
基于mysql的bbs设计(二)
Oct 09 PHP
php mysql 判断update之后是否更新了的方法
Jan 10 PHP
CodeIgniter启用缓存和清除缓存的方法
Jun 12 PHP
ThinkPHP实现二级循环读取的方法
Nov 03 PHP
两种php给图片加水印的实现代码
Apr 18 PHP
SESSION存放在数据库用法实例
Aug 08 PHP
简单谈谈PHP面向对象之标识对象
Jun 27 PHP
利用PHP获取访客IP、地区位置、浏览器及来源页面等信息
Jun 27 PHP
PHP如何实现订单的延时处理详解
Dec 30 PHP
php连接MSsql server的五种方法总结
Mar 04 PHP
详解php中生成标准uuid(guid)的方法
Apr 28 PHP
php curl抓取网页的介绍和推广及使用CURL抓取淘宝页面集成方法
Nov 30 #PHP
PHP curl模拟登录带验证码的网站
Nov 30 #PHP
PHP可变函数学习小结
Nov 29 #PHP
PHP可变变量学习小结
Nov 29 #PHP
PHP中对数组的一些常用的增、删、插操作函数总结
Nov 27 #PHP
详解PHP对数组的定义以及数组的创建方法
Nov 27 #PHP
实例简介PHP的一些高级面向对象编程的特性
Nov 27 #PHP
You might like
mysql中存储过程、函数的一些问题
2007/02/14 PHP
php数组函数序列之array_push() 数组尾部添加一个或多个元素(入栈),返回新长度。
2011/11/07 PHP
PHP中usort在值相同时改变原始位置问题的解决方法
2011/11/27 PHP
php curl基本操作详解
2013/07/23 PHP
PHP中new static()与new self()的区别异同分析
2014/08/22 PHP
Js实现双击鼠标自动滚动屏幕的示例代码
2013/12/14 Javascript
jQuery中ready事件用法实例
2015/01/19 Javascript
javascript实现点击按钮让DIV层弹性移动的方法
2015/02/24 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
jQuery实现分隔条左右拖动功能
2015/11/21 Javascript
BootStrap中Tab页签切换实例代码
2016/05/30 Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
2017/05/19 Javascript
Angular2管道Pipe及自定义管道格式数据用法实例分析
2017/11/29 Javascript
JS实现碰撞检测的方法分析
2018/01/19 Javascript
webpack配置导致字体图标无法显示的解决方法
2018/03/06 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
微信小程序实现文字无限轮播效果
2018/12/28 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
2019/08/27 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
2019/09/18 Javascript
JS函数进阶之继承用法实例分析
2020/01/15 Javascript
python使用正则搜索字符串或文件中的浮点数代码实例
2014/07/11 Python
在Django中实现添加user到group并查看
2019/11/18 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
Python实现企业微信机器人每天定时发消息实例
2020/02/25 Python
CSS3实现图片抽屉式效果的示例代码
2019/11/06 HTML / CSS
html5 postMessage前端跨域并前端监听的方法示例
2018/11/01 HTML / CSS
波兰在线儿童和婴儿用品零售商:pinkorblue
2019/06/29 全球购物
费用会计岗位职责
2014/01/01 职场文书
学习雷锋寄语大全
2014/04/11 职场文书
学习党章的体会
2014/11/07 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
公司开会通知
2015/04/20 职场文书
小学英语新课改心得体会
2016/01/22 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
解决python存数据库速度太慢的问题
2021/04/23 Python
我的收音机情缘
2022/04/05 无线电