這幾天在作抓取.發現用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
失敗次數:0it
第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,明顯是後者快一些.