PHP速度测试在当前页面中没有回声的用户连接速度

时间:2010-10-15 14:10:57

标签: php connection speed-test

我正在寻找检查用户连接速度的可能性。它应该保存为cookie,如果速度很慢,javascript文件以及css文件将被调整。

目前测试速度的可能性如下:

    $kb = 512;

    flush();
    //
    echo "<!-";
    $time = explode(" ",microtime());
    for($x=0;$x<$kb;$x++){
        echo str_pad('', 512, '.');
        flush();
    }
    $time_end = explode(" ",microtime());
    echo "->";

    $start = $time[0] + $time[1];
    $finish = $time_end[0] + $time_end[1];
    $deltat = $finish - $start;

    return round($kb / $deltat, 3);

虽然它有效但我不喜欢在我的代码中放入这么多字符,如果我回应所有这些我无法将结果保存在cookie中,因为已经有输出。

可以在不同的文件中做一些这样的事吗?你有任何解决方案吗?

提前致谢。

7 个答案:

答案 0 :(得分:8)

  

你有解决方案吗?

我的解决方案是根本不打扰速度测试。原因如下:

您说测试的原因是确定要发送的JS / CSS文件。您必须记住,浏览器将在首次下载后缓存这些文件(只要它们尚未被修改)。所以实际上,你发送了256K的测试数据,以确定你是否应该发送额外的512K?

只需发送数据即可进行缓存。除非你有MB的JS / CSS(在这种情况下你需要重新设计网站,而不是速度测试),下载时间将是可行的。速度测试应保留用于流式视频等内容。

答案 1 :(得分:3)

我能想出的唯一想法是重定向。

  • 衡量用户的速度
  • 重定向到索引

虽然这不是一个好的解决方案,但它只需要测量用户的速度一次,所以我认为这是可以原谅的。

答案 2 :(得分:1)

这里的问题是你无法真正解决这个问题,而且可能不是纯PHP。您采用的方法将使用户下载(512x512)= 262 144字节的无用数据,这比大多数完整页面大得多。如果用户连接速度很慢,他们可能会认为您的站点在速度测试结束之前已经关闭(10 kB / sec,在屏幕上显示任何有趣内容之前需要半分钟!)。

您可以为已知大小和时间 所花费的文件发出AJAX请求。这里的问题是页面需要已经加载才能工作,所以它只适用于后续页面。

你可以创建一个“加载”页面(就像你在慢速连接中访问GMail时看到的那样)预加载数据,带有低带宽版本的链接(或者如果加载过程也可能是重定向)长)。

或者您可以在cookie中保存“开始”时间并在页面加载完成后发出AJAX请求 - 这将为您提供页面的实际加载时间;如果超过10秒,那么您可能需要切换到低带宽版本。

然而,这些都不会让你在第一次访问时获得速度;并且预先发送大空页也不是一个很好的第一印象。

答案 3 :(得分:1)

如何使用javascript计算加载页面所需的时间。然后使用javascript设置cookie。

javascript http://phpjs.org/functions/microtime:472

中的microtime

使用jQuery

<head>
<!-- include jquery & other html snipped -->

<script>

function microtime (get_as_float) {
    // http://kevin.vanzonneveld.net
    // +   original by: Paulo Freitas
    // *     example 1: timeStamp = microtime(true);
    // *     results 1: timeStamp > 1000000000 && timeStamp < 2000000000

    var now = new Date().getTime() / 1000;
    var s = parseInt(now, 10);

    return (get_as_float) ? now : (Math.round((now - s) * 1000) / 1000) + ' ' + s;
}

function setCookie(c_name, value, expiredays) {
var exdate=new Date();
exdate.setDate(exdate.getDate()+expiredays);
document.cookie=c_name+ "=" +escape(value)+
((expiredays==null) ? "" : ";expires="+exdate.toUTCString());
}

start = microtime(true);

$(window).load(function () {
  // everything finished loading
  end = microtime(true);
  diff = end - start;
  // save in a cookie for the next 30 days

    setCookie('my_speed_test_cookie', diff, 30);
});

</script>
</head>
<body>
<p>some page to test how long it loads</p>
<img src="some_image_file.png">
</body>

一些陷阱: - 页面需要先开始加载。需要加载JQuery(或者你可以重做上面的代码来避免jQuery)

  • 测试ASCII / Latin数据的速度可能无法获得最佳结果,因为字符可能会被压缩。除了高级gzip压缩之外,一些调制解调器/线路(如果不是全部)具有能够检测重复字符的基本压缩,并告诉另一端下一个500重复''。我想最好使用已压缩的二进制数据

答案 4 :(得分:1)

您访问第一页(可能包含所有外部文件的100kB),会话无处不在 $ _SESSION [“start_time”] = time();

页面加载完成后(jQuery窗口加载或smth :)你再次发送一个请求, 你计算速度(jQueryRequestTime - $ _SESSION [“start_time”] / PageSize)并设置另一个会话变量,他点击的下一个链接然后可以包括为此批准的自定义css / js

ofc这不是正确的:)

答案 5 :(得分:0)

确定用户的速度后,将javascript发送到浏览器设置cookie,然后在速度低于您想要的情况下进行刷新或重定向。

答案 6 :(得分:0)

我唯一能想到的就是订阅一个提供IP到网速查询的服务。这些服务通过构建IP地址数据库并对其注册的预期用途进行编目来工作。它们并不总是准确的,但确实提供了一个起点。根据其中一个查找用户的IP地址,看看它返回的内容。

Ip2Location.com提供了这样一个数据库,从他们的DB13产品开始。

当然,如果您的目标是网站的移动版本,则用户代理嗅探是更好的解决方案。