PHP學習筆記,curl,file_get_content,include和fopen四種方法獲取遠程文件速度測試.

這幾天在作抓取.發現用PHP的file_get_contents函數來獲取遠程文件的過程當中老是出現失敗,而且效率很低下.因此就作了個測試的demo來測試下PHP中各類方法獲取文件的速度.php

程序裏面使用了四種方法   分別是curl

1,使用輸入輸出緩衝和include包含遠程文件拿到對應url的內容函數

這個須要開啓PHP的allow_url_include選項測試

2,使用fopen來以只讀的方式打開並讀取遠程文件.url

3,使用file_get_contents函數來獲取遠程url文件.spa

4,使用PHP的curl拓展來獲取遠程文件.blog

具體裏面是啥工做原理我不知道,不過經過測試我獲得的結果是get

第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
it

 

 

第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,明顯是後者快一些.

相關文章
相關標籤/搜索