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(& ...
随机推荐
- Hello Word!
第一次来博客园,作为技术的基站,多余的话不说了,就一个helloword! <script type="text/javascript"> //等待dom元素加载完毕. ...
- Common-logging 与 Log4j的结合使用
分类: Java 一.结合说明 在我们的日常开发中,经常需要通过输出一些信息进行程序的调试,如果到处都用system.out.println()则在项目发布之后要逐一删除,而log4j提供了一种新的调 ...
- MAC下用OPENSSL生成公钥和私钥
MAC OS自带了OpenSSL,所以不用去编译那一坨跟SHIT一样的源码.直接在命令行里使用OPENSSL就可以. 打开命令行工具,然后输入 openssl打开openssl,接着只要三句命令就可以 ...
- nginx+keepalived+tomcat之具体配置档
前沿知识点: nginx负责负载均衡(反向代理) msm(memcached session manager)负责缓存会话信息,从而实现会话保持 所需包: nginx和memcached采用最新稳定版 ...
- python 连接Mysql数据库
1.下载http://dev.mysql.com/downloads/connector/python/ 由于Python安装的是3.4,所以需要下载下面的mysql-connector-python ...
- HDU 2266 How Many Equations Can You Find(DFS)
How Many Equations Can You Find Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d ...
- C# Environment类_获取程序所在机器信息
一.属性 CommandLine 获取该进程的命令行.CurrentDirectory 获取或设置当前工作目录的完全限定路径.ExitCode 获取或设置进程的退出代码.HasShutdownSta ...
- Windows 7下可以使用的各个命令语句+C#打开
Windows 7下可以使用的各个命令语句: control.exe /name microsoft.folderoptions 启动资源管理器的 文件夹属性 选项卡 control.exe /n ...
- 使用achartengine实现自定义折线图 ----附代码 调试OK
achartengine作为android开发中最常用的实现图标的开源框架,使用比较方便,参考官方文档谢了如下Demo,实现了自定义折线图. package edu.ustb.chart; impor ...
- css案例学习之按钮超链接
效果 css实现 <html> <head> <title>按钮超链接</title> <style> a{ /* 统一设置所有样式 */ ...