用PHP下载网页的最快方法
有很多不同的方法可以使用PHP下载网页,但是哪种方法最快?在这篇文章中,我将介绍下载网页的多种方法,并对它们进行测试以找出最快的方法。
这是不同方法的列表。
PHPcurl库。
史努比PHPWeb浏览器。基本上是fsockopen的包装。
fsockopen()。
fopen()与feof()。
fopen()与stream_get_contents()。
file()然后implode()。
file_get_contents()功能。
每种方法都将运行,并且每种方法将检索一次网页内容50次,以便获得可观的传播时间。在每次运行时,时间将记录到一个数组中,然后将在最后使用该数组来计算一些统计信息。
测试的一部分将是什么也不做,以查看PHP在运行基准测试功能上花费了多少时间。
另外,我将针对两种不同类型的网页运行该功能,一种具有很多内容,而一种没有内容,因为这将显示该功能的基本速度。该hashbangcode.com服务器将用作测试的一部分,但我还将使用该php.net站点来查看高带宽站点对结果有何影响。
代码的开头将为其余测试设置变量。
现在已完成所有设置,我们可以遍历每种方法并记录时间。
for ($i = 0; $i <= 50; ++$i) { //////////////////////////////////////////////////////////////////////////////////// //什么也不做 $start = microtime(); $end = microtime(); $times['nothing'][] = (getmicrotime($end) - getmicrotime($start)); //////////////////////////////////////////////////////////////////////////////////// //curl $start = microtime(); $ch = curl_init(); $user_agent = "Mozilla/4.0"; curl_setopt ($ch, CURLOPT_URL, $url); curl_setopt ($ch, CURLOPT_USERAGENT, $user_agent); curl_setopt ($ch, CURLOPT_HEADER, 1); curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); curl_setopt ($ch, CURLOPT_TIMEOUT, 120); $contents = curl_exec($ch); curl_close($ch); $end = microtime(); $times['curl'][] = (getmicrotime($end) - getmicrotime($start)); //////////////////////////////////////////////////////////////////////////////////// //snoopy $start = microtime(); $snoopy = new Snoopy(); $snoopy->fetch($url); $contents = $snoopy->results; $end = microtime(); $times['snoopy'][] = (getmicrotime($end) - getmicrotime($start)); //////////////////////////////////////////////////////////////////////////////////// //fopen $start = microtime(); if($handle = @fopen($url, "r")){ while(!feof($handle)){ $contents .= fread($handle, 4096); } fclose($handle); } $end = microtime(); $times['fopen'][] = (getmicrotime($end) - getmicrotime($start)); //////////////////////////////////////////////////////////////////////////////////// //用stream_get_contents打开 $start = microtime(); if($stream = fopen($url, 'r')){ $contents = stream_get_contents($stream); fclose($stream); } $end = microtime(); $times['stream'][] = (getmicrotime($end) - getmicrotime($start)); //////////////////////////////////////////////////////////////////////////////////// //file $start = microtime(); $html = implode('', file($url)); $end = microtime(); $times['file'][] = (getmicrotime($end) - getmicrotime($start)); //////////////////////////////////////////////////////////////////////////////////// //fsockopen $start = microtime(); $fp = fsockopen($domain, 80, $errno, $errstr, 30); if(!$fp){ $contents .= $errstr.' ('.$errno.')
'; }else{ //发送标题 $out = "GET ".fsockopen($domain, 80, $errno, $errstr, 30)." HTTP/1.1\r\n"; $out .= "Host: ".str_replace('http://'.$domain,'',$url)."\r\n"; $out .= "User-Agent: FSOCKOPEN\r\n"; $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); while(!feof($fp)){ $contents .= fgets($fp, 4096); }; fclose($fp); }; $end = microtime(); $times['fsockopen'][] = (getmicrotime($end) - getmicrotime($start)); //////////////////////////////////////////////////////////////////////////////////// //file_get_contents $start = microtime(); $contents = file_get_contents($url); $end = microtime(); $times['file_get_contents'][] = (getmicrotime($end) - getmicrotime($start)); }至此一切都完成了,我们现在可以与时俱进。首先,我对时间进行了排序,然后得出了一些简单的信息,例如平均时间,最小时间和最大时间。
//整理时间 sort($times['nothing']); sort($times['curl']); sort($times['snoopy']); sort($times['fopen']); sort($times['stream']); sort($times['file']); sort($times['fsockopen']); sort($times['file_get_contents']); //打印时间 echo ''.print_r($times,true).''; //计算时间统计 foreach ($times as $method=>$time){ echo ''.$method.' average = '.(array_sum($time)/count($time)).'
'; }
min = '.$time[0].'
max = '.$time[count($time)-1].'这是下载空白网页的结果。我不会一直打印出来,因为这会占用很多空间并且毫无意义。
nothing average = 7.320852840648E-6 min = 5.0067901611328E-6 max = 1.6927719116211E-5 curl average = 0.083804859834559 min = 0.073469161987305 max = 0.16210603713989 snoopy average = 0.089839958677105 min = 0.074288129806519 max = 0.14481902122498 fsockopen average = 0.13405424005845 min = 0.10800695419312 max = 0.39040613174438 fopen average = 0.12635245042689 min = 0.10596394538879 max = 0.19953107833862 stream average = 0.1248401520299 min = 0.10655999183655 max = 0.17397904396057 file average = 0.12469244470783 min = 0.10594987869263 max = 0.19219899177551 file_get_contents average = 0.12691019095627 min = 0.10590195655823 max = 0.17201805114746以下是访问该hashbangcode.com网站首页的结果,即27.17kB。
nothing average = 7.9659854664522E-6 min = 5.0067901611328E-6 max = 4.2915344238281E-5 curl average = 0.40228473438936 min = 0.34250092506409 max = 1.2593679428101 snoopy average = 0.37644760748919 min = 0.34368300437927 max = 0.60013008117676 fsockopen average = 0.12776509920756 min = 0.10803699493408 max = 0.22104907035828 fopen average = 0.41444192213171 min = 0.37545895576477 max = 0.77188587188721 stream average = 0.41173196306416 min = 0.37820982933044 max = 0.62948799133301 file average = 0.40511836725123 min = 0.3781590461731 max = 0.69333410263062 file_get_contents average = 0.41732146693211 min = 0.37894988059998 max = 0.68813395500183以下是访问该php.net网站首页的结果,即31.13kB。
nothing average = 7.9566357182521E-6 min = 5.0067901611328E-6 max = 4.1961669921875E-5 curl average = 1.3938542253831 min = 1.0989301204681 max = 1.7416069507599 snoopy average = 1.3927017473707 min = 1.1879198551178 max = 1.6753461360931 fsockopen average = 0.61519114176432 min = 0.56387495994568 max = 1.0507898330688 fopen average = 1.7791449415917 min = 1.5167849063873 max = 5.4117441177368 stream average = 1.6853758213567 min = 1.4832580089569 max = 2.3599371910095 file average = 1.7028319742165 min = 1.4881958961487 max = 2.3575241565704 file_get_contents average = 1.7295382069606 min = 1.5339889526367 max = 2.5368640422821这是结果图。
结果表明,如果要下载的页面具有任何内容,则可以使用最快的方式下载网页fsockopen()。如果页面内容很少或没有内容,则最好使用,curl()因为这样做fsockopen()似乎效果最差。
因此,这fsockopen()是获取网页的最快方法。但是,最好不要使用Snoopy来进行所有fsockopen()呼叫,因为重新发明轮子来完成简单的任务没有意义。如果您确实需要速度,并且确定将始终使用同一页面,请使用自己的fsockopen()功能。史努比确实会增加一些开销,但是我认为使用史努比的好处胜于速度的下降。
数据的奇怪之处在于下载hashbangcode.comphp.net和php.net主页之间的时间差。我希望php.net服务器花费的时间更少,尽管fsockopen()比其他任何一种方法都快得多,但最慢的方法php.net比该hashbangcode.com站点花费了超过一秒钟的时间来下载该站点。页面大小大约有3kB的差异,但这不足以实现这样的结果。我唯一能想到的是php.net服务器的距离导致了这种速度差异。我在英国自己的计算机上运行结果,该php.net服务器托管在美国。
在任何情况下,什么都不做大约需要0.000008秒,这实际上根本不是时间,这表明基准测试功能为整个过程花费了很少的时间。此时间可以与每种方法所花费的时间相去甚远,以得出更实际的结果。
如果您有其他任何我想念的方法,请发表评论,让我知道。同样,如果人们在自己的计算机/主机上运行此命令以求出全球平均时间,那将很有趣,因为更改这些时间还涉及其他因素。如果您运行此测试,请将结果发送给我,以便我进行整理。