PHP学习笔记,curl,file_get_content,include和fopen四种方法获取远程文件速度测试.
这几天在做抓取.发现用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(" ::::<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("  ::::<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("  ::::<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("  ::::<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四种方法获取远程文件速度测试.的更多相关文章
- MySQL学习笔记(2) - 修改MySQL提示符的两种方法
学习于慕课网 http://www.imooc.com/video/1806 1.方法一: cmd中处于未登录状态时,输入 mysql -uroot -p自己的密码 --prompt 新的提示符 示例 ...
- C# Emgu CV学习笔记二之图像读写的两种方法
http://blog.csdn.net/marvinhong/article/details/6800450 图像显示在控件loadPictureBox上 方法一 //读取图像001.jpg Int ...
- SpringBoot学习笔记(5)----SpringBoot中异常处理的三种方法
对于异常的处理,Spring Boot中提供默认的一个异常处理界面,如下图: 但是在实际的运用开发中,这样的页面显然是不友好的,Spring Boot也提供了自定义异常处理的方式,如下总结三种一场处理 ...
- Qt学习笔记----信号与槽实现的四种方式
1.以按钮为例,首先添加一个按钮,对象名为pushButton,在按钮是右键单击选择“转到槽”即可,在转到槽选择面板(右图)里面选择需要进行的操作,比如单击clicked() 2.选择菜单“编辑”,找 ...
- 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring实例化Bean的三种方法
在面向对象的程序中,要想调用某个类的成员方法,就需要先实例化该类的对象.在 Spring 中,实例化 Bean 有三种方式,分别是构造器实例化.静态工厂方式实例化和实例工厂方式实例化. 构造器实例化 ...
- C#可扩展编程之MEF学习笔记(三):导出类的方法和属性
前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的. 还是前面的代码,第二篇中已经提供 ...
- golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息
golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...
- python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码
python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...
- curl获取远程文件内容
curl获取远程文件内容 ** 获取远程文件内容 @param $url 文件http地址 * function fopen_url($url) { if (function_exists(& ...
随机推荐
- activiti笔记一:流程图xml文件
一. 流程图有两个基本要素组成:点和线 点:开始节点.结束节点.各种网关.各种事件 线:连接两点之间的sequenceFlow 二. 一般包含三个步骤:部署.启动.完成 三. 启动的时候,可以设置流程 ...
- 让操作javascript对象数组像.net lamda表达式一样
让操作javascript对象数组像.net lamda表达式一样 随着web应用程序的富客户端化.ajax的广泛使用及复杂的前端业务逻辑.对js对象数组.json数组的各种操作越来越多.越来越复杂. ...
- EcStore中的App是什么东西?
Ecstore中的App不是手机上的App,它是一个Web应用包,集合了Web应用的后端PHP程序.Mysql数据表定义,以及前端HTML+CSS+JS展现,通常是实现某个业务功能,如购物车.促销.支 ...
- Hibernate中3种结果转换的详细说明(转)
Hibernate中3种结果转换的详细说明 在hibernate使用的过程中.我们通常需要对结果进行解释. Hibernate为我们提供了以下3种解释方法: Transformers.ALIAS_TO ...
- Linux服务器配置WEB应用日志文件到指定目录
在Linux服务器上配置WEB应用程序日志到指定文件 服务器环境是 RedHat Linux, 其上运行的是 Apache + Tomcat,容器中运行的是我们公司的壹个小型电子商务网站,原来项目 ...
- case then 的用法 貌似case then不支持别名
set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo ALTER PROC [dbo].[usp_SRV_GetALLRelativeProject]@Service ...
- Wikioi 1169 传纸条
这道题是我人生第一道双线动规题,因此我觉得还是很有必要记录下来. 刚接触到这道题的时候我第一反应是单线的动规,可是下一秒我就觉得这样做可能会有问题,因为从左上角(以下简称A)到右下角(以下简称B)通过 ...
- 把程序嵌入网页之ATL编写ActiveX[标准窗口+接受参数]
从VS2010开始ATL ActiveX支持IObjectSafety接口,所以用VS2010来编写,新建一个ATL项目 向导的第一页没什么东西,直接下一步,选项可以根据具体需求调整 点“完成”,切换 ...
- ACM学习-POJ-1143-Number Game
菜鸟学习ACM,纪录自己成长过程中的点滴. 学习的路上,与君共勉. ACM学习-POJ-1143-Number Game Number Game Time Limit: 1000MS Memory ...
- 三十二、Java图形化界面设计——布局管理器之CardLayout(卡片布局)
摘自 http://blog.csdn.net/liujun13579/article/details/7773945 三十二.Java图形化界面设计--布局管理器之CardLayout(卡片布局) ...