这几天在做抓取.发现用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. java读取xml(当xml放在包里时)

  2. requirejs学习之-- 初始化(一)

    为了规范在项目中使用的javascript代码,我们使用了requirejs框架. 初始阶段,我们在按钮的点击事件中调用创建的模块,代码如下: function button_click() { _t ...

  3. Oracle Trunc

    http://www.cnblogs.com/xiaoyudz/archive/2011/03/18/1988467.html

  4. Why Does Qt Use Moc for Signals and Slots(QT官方的解释:GUI可以是动态的)

    GUIs are Dynamic C++ is a standarized, powerful and elaborate general-purpose language. It's the onl ...

  5. 《深入了解 Linq to SQL》之对象的标识 —— 麦叔叔呕心呖血之作

    序言 很多朋友都向我提过,希望我写一下关于Linq to SQL 或者 VS 插件方面的文章.尽管市面上有很多 Linq to SQL 的书籍,但是都是介绍怎么用,缺乏深度.关于 VS 插件方面的书籍 ...

  6. bzoj1632 [Usaco2007 Feb]Lilypad Pond

    Description Farmer John 建造了一个美丽的池塘,用于让他的牛们审美和锻炼.这个长方形的池子被分割成了 M 行和 N 列( 1 ≤ M ≤ 30 ; 1 ≤ N ≤ 30 ) 正方 ...

  7. 几个js的linq实现

    几个js的linq实现 linqjs.codeplex.com jslinq.codeplex.com javascriptiqueryable.codeplex.com fromjs.codeple ...

  8. 剑指offer-面试题.二叉树的镜像

    题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像.  二叉树节点定义如下: strcut BinaryTreeNode { int val; strcut BinaryTreeNode* m_ ...

  9. HDU5437 Alisha’s Party (优先队列 + 模拟)

    Alisha’s Party Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  10. 二十七、Java图形化界面设计——容器(JFrame)

    摘自http://blog.csdn.net/liujun13579/article/details/7756729 二十七.Java图形化界面设计--容器(JFrame) 程序是为了方便用户使用的, ...