这几天在做抓取.发现用PHP的file_get_contents函数来获取远程文件的过程中总是出现失败,并且效率很低下.所以就做了个测试的demo来测试下PHP中各种方法获取文件的速度.

程序里面使用了四种方法   分别是

1,使用输入输出缓冲和include包含远程文件拿到对应url的内容

这个需要开启PHP的allow_url_include选项

2,使用fopen来以只读的方式打开并读取远程文件.

3,使用file_get_contents函数来获取远程url文件.

4,使用PHP的curl拓展来获取远程文件.

具体里面是啥工作原理我不知道,不过通过测试我得到的结果是

第100次调用:get_file_by_curl:used_time ::::0.0732s
100次平均时间:0.084043
失败次数:0

第100次调用:get_file_by_file_get_contents:used_time  ::::0.103s
100次平均时间:0.11445643564356
失败次数:0

第100次调用:get_file_by_fopen:used_time  ::::0.0905s
100次平均时间:0.086212871287129
失败次数:0

第100次调用:get_file_by_include:used_time  ::::0.1248s
100次平均时间:0.11332079207921
失败次数:0

这上面是通过100次请求博客园首页的文件得出的结果  数据不多,但是还是能看出来区别的  用file_get_contents和include+缓冲区这两种方法的速度明显要比curl和fopen两种方式慢

下面是测试代码

<?php
/**
*名称:远程获取文件测试
*作用:测试各种方法获取远程文件的速度
*作者:swordphp@126.com
*创建时间:2013-08-29
*最后修改时间:2013-08-29
**/
ini_set("max_execution_time", "0");
set_time_limit(0);
ini_set("error_reporting", "E_ALL & ~E_NOTICE");
ini_set("allow_url_include",1);
class fileget_test{
public function __construct(){ }
//通过CURL拓展获取文件内容
public function get_file_by_curl($url){
echo "get_file_by_curl:used_time";
$start_time = microtime(true);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);//设置curl地址
curl_setopt($ch, CURLOPT_TIMEOUT, 5);//设置超时时间.
curl_setopt($ch, CURLOPT_USERAGENT, _USERAGENT_);
curl_setopt($ch, CURLOPT_REFERER,_REFERER_);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$content = curl_exec($ch);
curl_close($ch);
$used_time = round((microtime(true)-$start_time),4);
echo nl2br("&nbsp::::<span style=\"color:red\";>".$used_time."s\n\r</span>");
return $used_time;
}
//通过file_get_content来获取文件内容
public function get_file_by_file_get_contents($url){
echo "get_file_by_file_get_contents:used_time";
$start_time = microtime(true);
$content = file_get_contents($url);
$used_time = round((microtime(true)-$start_time),4);
echo nl2br("&nbsp ::::<span style=\"color:red\";>".$used_time."s\n\r</span>");
return $used_time;
}
//通过fopen来获取文件内容
public function get_file_by_fopen($url){
echo "get_file_by_fopen:used_time";
$start_time = microtime(true);
$handle = fopen($url,'r');
$content = fread($handle, 100000);
fclose($handle);
$used_time = round((microtime(true)-$start_time),4);
echo nl2br("&nbsp ::::<span style=\"color:red\";>".$used_time."s\n\r</span>");
return $used_time;
}
//通过include获取远程文件
public function get_file_by_include($url){
echo "get_file_by_include:used_time";
$start_time = microtime(true);
ob_start();
include($url);
$coutent = ob_get_contents();
ob_clean();
$used_time = round((microtime(true)-$start_time),4);
echo nl2br("&nbsp ::::<span style=\"color:red\";>".$used_time."s\n\r</span>");
return $used_time;
}
}
function my_test($function,$url){
$res = array();
$test = new fileget_test;
switch ($function) {
case 'get_file_by_curl':
for($i=1;$i<=100;$i++){
echo "第".$i."次调用:";
$res[$i] = $test ->get_file_by_curl($url);
}
echo nl2br("100次平均时间:".array_sum($res)/count($res)."\n\r");
echo "失败次数:".count(array_keys($res,false));
break;
case 'get_file_by_file_get_contents':
for($i=0;$i<=100;$i++){
echo "第".$i."次调用:";
$res[$i] = $test ->get_file_by_file_get_contents($url);
}
echo nl2br("100次平均时间:".array_sum($res)/count($res)."\n\r");
echo "失败次数:".count(array_keys($res,false));
break;
case 'get_file_by_fopen':
for($i=0;$i<=100;$i++){
echo "第".$i."次调用:";
$res[$i] = $test ->get_file_by_fopen($url);
}
echo nl2br("100次平均时间:".array_sum($res)/count($res)."\n\r");
echo "失败次数:".count(array_keys($res,false));
break;
case 'get_file_by_include':
for($i=0;$i<=100;$i++){
echo "第".$i."次调用:";
$res[$i] = $test ->get_file_by_include($url);
}
echo nl2br("100次平均时间:".array_sum($res)/count($res)."\n\r");
echo "失败次数:".count(array_keys($res,false));
break;
default:
echo "no function selected!";
break;
} }
$function = $_GET['f'];
$url = isset($_GET['url'])?$_GET['url']:'http://www.taobao.com';
my_test($function,$url);

  这个测试的结果还不能够说明什么,我打算再找机会好好测试下.这里我有几个地方不太理解,之前有人也做过类似的测试 只测试了file_get_content和curl,明显是后者快一些.

PHP学习笔记,curl,file_get_content,include和fopen四种方法获取远程文件速度测试.的更多相关文章

  1. MySQL学习笔记(2) - 修改MySQL提示符的两种方法

    学习于慕课网 http://www.imooc.com/video/1806 1.方法一: cmd中处于未登录状态时,输入 mysql -uroot -p自己的密码 --prompt 新的提示符 示例 ...

  2. C# Emgu CV学习笔记二之图像读写的两种方法

    http://blog.csdn.net/marvinhong/article/details/6800450 图像显示在控件loadPictureBox上 方法一 //读取图像001.jpg Int ...

  3. SpringBoot学习笔记(5)----SpringBoot中异常处理的三种方法

    对于异常的处理,Spring Boot中提供默认的一个异常处理界面,如下图: 但是在实际的运用开发中,这样的页面显然是不友好的,Spring Boot也提供了自定义异常处理的方式,如下总结三种一场处理 ...

  4. Qt学习笔记----信号与槽实现的四种方式

    1.以按钮为例,首先添加一个按钮,对象名为pushButton,在按钮是右键单击选择“转到槽”即可,在转到槽选择面板(右图)里面选择需要进行的操作,比如单击clicked() 2.选择菜单“编辑”,找 ...

  5. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring实例化Bean的三种方法

    在面向对象的程序中,要想调用某个类的成员方法,就需要先实例化该类的对象.在 Spring 中,实例化 Bean 有三种方式,分别是构造器实例化.静态工厂方式实例化和实例工厂方式实例化. 构造器实例化 ...

  6. C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...

  7. golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

    golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

  8. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  9. curl获取远程文件内容

    curl获取远程文件内容 ** 获取远程文件内容 @param $url 文件http地址 * function fopen_url($url) { if (function_exists(& ...

随机推荐

  1. Jquery表单与表格的运用

    1,表单的应用: a. 单行文本框的应用  多行文本框的应用 b.复选框的框的应用 c.下拉框的应用 d.表单验证 2,表格的应用: a. 表格变色 b.表格展开关闭 d.表格内容筛选 3,多行文本框 ...

  2. 在Python3.5下安装和测试Scrapy爬网站

    1. 引言 Scrapy框架结构清晰,基于twisted的异步架构可以充分利用计算机资源,是爬虫做大的必备基础.本文将讲解如何快速安装此框架并使用起来. 2. 安装Twisted 2.1 同安装Lxm ...

  3. 【python学习笔记01】python的数据类型

    python的基本数据类型 整型 int 浮点型 float 真值 bool 字符串 str 列表 list       #[1,2,3] 元组 tuple    #(1,2,3) 字典 dict   ...

  4. Knight Moves(BFS,走’日‘字)

    Knight Moves Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  5. path类和directory类对文件的路径或目录进行操作

    Path: 对文件或目录的路径进行操作(很方便)[只是对字符串的操作] 1.目录和文件操作的命名控件System.IO    2.string Path.ChangeExtension(string ...

  6. linux下源码安装apache服务

    1.搭建静态网站是,我们只需要搭建apache服务即可满足要求. 例如:如果我再客户端游览器输入地址,他会找到192.168.1.100这个服务器,然后根据端口会找到apache服务器.apache他 ...

  7. Mac Outlook数据文件的位置

    ****/Documents/Microsoft User Data/Office 2011 Identities/Main Identity 在这里 如果是中文版的,在这里: /Users/×××× ...

  8. awk 处理

    find . -type f | awk '{print $NF}' | grep pdf$ |grep -v preview | while read A; do ls -ltr $A| awk ' ...

  9. CentOS 6.3安装Nginx 搭建文件服务器

    转自:http://www.linuxidc.com/Linux/2012-09/70596.htm 1.配置CentOS 6.2 第三方yum源(CentOS默认的标准源里没有nginx软件包): ...

  10. UESTC_棋盘游戏 CDOJ 578

    最近昀昀学习到了一种新的棋盘游戏,这是一个在一个N×N的格子棋盘上去搞M个棋子的游戏,游戏的规则有下列几条: 棋盘上有且仅有一个出口 开始时没有哪个棋子在出口,而且所有棋子都不相邻(这里的相邻是指上下 ...