实际上这个很简单的,用任何语言都能实现,主要的奥秘是在JAVASCRIPT中。
思路是:加载一个比较大的图片,在开始时用JAVASCRIPT记录一下时间,加载完毕后再记录一下时间,图片大小是已知的,开始时间和结束时间已是已知的,呵呵,计算带宽就是小学数学问题了。
具体做法如下:
testspeed.php
<script language="JavaScript">
<!-- hide scriptfunction RightNow()
{
var time; time = new Date();
return time.getTime();
}function CalcSpeed(timeStart)
{
var timeEnd, timeElapsed, kbytes; timeEnd = RightNow();
timeElapsed = (timeEnd - timeStart)/1000 - 0.15; kbytes = 61/timeElapsed document.forms[0].kbytes.value = kbytes;
document.forms[0].submit();}// end hide script -->
</script>
Testing.....
<!-- ***** SCRIPT: GET TIME 取开始时间***** -->
<script language="JavaScript">
<!-- hide script
timeStart = RightNow();
// end hide script -->
</script><!-- ***** IMAGE TO DOWNLOAD ***** --><img src=images/62816bytes.gif‘width='1' height='1' onload='CalcSpeed(timeStart);'><br><!-- ***** FORM ***** -->
<form action="speedTestResults.php" method="post">
 <input type="hidden" name="kbytes" value="">
</form>
<!-- ***** END FORM ***** -->这段程序的关键点在于利用img的onload事件,onload事件在图片加载完毕后触发,然后通过CalcSpeed函数计算下载速率并提交到结果显示页speedTestResults.php。本例中我用了一个62816字节的白色图片进行下载测试。当然,看上去可以了,但并不是完美无缺!上面程序在第一次运行时正常,但第二次运行......下载速率超过10M!!!就是你用小猫上网也一样,是小猫变成了老虎?呵呵,不要高兴得太早,小猫还是小猫,是变不成老虎的,这是因为浏览器的缓存帮了倒忙,第二次运行时该图片就在缓存中,浏览器就会直接从你的硬盘上读取,实际上你测试的是硬盘的读取速度!那么怎么解决这个问题呢,很简单,在图片后写一串随机的query string就可以了。这样就可以骗过浏览器啦!
OK,我们把图片那段改成这样:<img src=images/62816bytes.gif?hahaha=<?=time()?>‘width='1' height='1' onload='CalcSpeed(timeStart);'>哼哼!小猫的原形就露出来啦!