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(& ...
随机推荐
- SqlServer排序(null值,和非空值排列顺序)
项目中遇到一个问题,需要设置序号排序,而该字段中的默认值为空,使用普通排序,空值就会在最前边.可以使用如下语句: 其中 col 为 排序的字段名称. then 0 else 1 代表先空值,后数字 ...
- [C++程序设计]引用
对一个数据可以使用“引用”(reference),这是C++对C的一个重要扩充,引用是一种新的变量类型,它的作用是为一个变量起一个别名.假如有一个变量a,想给它起一个别名b,可以这样写:int a; ...
- 《Python基础篇》之初识Python一
Python简介 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚本解释程序,作为ABC语言 ...
- 网关协议学习:CGI、FastCGI、WSGI、uWSGI
一直对这四者的概念和区别很模糊,现在就特意梳理一下它们的关系与区别. CGI CGI即通用网关接口(Common Gateway Interface),是外部应用程序(CGI程序)与Web服务器之间的 ...
- 再谈php乱码问题
在开博不久,写了一篇关于解决php乱码问题文章,php 解决乱码的通用方法,绝大部分乱码,这篇博文都可以解决,但是也有例外. 如果有人传参数给你,你根本不知道,传给你的参数到底是什么编码,这个时候该怎 ...
- linux多线程编程之互斥锁
多线程并行运行,共享同一种互斥资源时,需要上互斥锁来运行,主要是用到pthread_mutex_lock函数和pthread_mutex_unlock函数对线程进行上锁和解锁 下面是一个例子: #in ...
- thinkphp项目目录
# ThinkPHP核心文件介绍 ├─ThinkPHP.php 框架入口文件 ├─Common 框架公共文件 ├─Conf 框架配置文件 ├─Extend ...
- QT字体的设置
摘要: QT4.7.0在移植到开发板上的时候,中文支持是必不可少的,如何让QT支持中文,如何制作QT支持的字体文件,如何使QT UI编辑器中的字号与开发板中的字号一致.作者通过实验进行了一一验证. 介 ...
- C# 多线程的自动管理(线程池) 基于Task的方式
C# 多线程的自动管理(线程池) 在多线程的程序中,经常会出现两种情况: 1. 应用程序中线程把大部分的时间花费在等待状态,等待某个事件发生,然后给予响应.这一般使用 ThreadPool(线程 ...
- 【转】ubuntu下putty的复制粘贴 -- 不错
原文网址:http://www.nwber.com/?p=165 今天在ubutnu下想用putty玩玩,突然发现在windows里直接点击右键的复制居然不管用了,调设置也没有用.这可麻烦了,要是手动 ...