6

我正在寻找检查用户连接速度的可能性。它应该保存为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 中,因为已经有输出。

可以在不同的文件中做这样的事情吗?你有什么解决办法吗?

提前致谢。

4

7 回答 7

8

你有什么解决办法吗?

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

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

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

于 2010-10-15T16:08:36.417 回答
3

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

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

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

于 2010-10-15T14:16:03.693 回答
1

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

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

您可以制作一个“加载”页面(就像您在从慢速连接访问时在 GMail 上看到的那样)预加载数据,并带有指向低带宽版本的链接(或者如果加载时间过长,可能会重定向)。

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

但是,这些都不会让您在第一次访问时获得速度;并且在前面发送一个大的空白页面也不是一个很好的第一印象。

于 2010-10-15T14:13:07.423 回答
1

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

javascript中的微时间http://phpjs.org/functions/microtime:472

使用 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 / 拉丁数据的测试速度可能不会给出最好的结果,因为字符可能会被压缩。除了高级 gzip 压缩之外,一些调制解调器/线路(如果不是全部)具有基本压缩,能够检测重复字符并告诉另一端接下来的 500 个是重复的“”。我想最好使用已压缩的二进制数据
于 2010-10-15T14:58:59.513 回答
1

您访问第一页(所有外部文件可能为 100kB),会话立即开始

$_SESSION["start_time"] = time();

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

ofc 这并不完美:)

于 2010-10-16T19:38:10.400 回答
0

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

于 2010-10-15T14:53:37.123 回答
0

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

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

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

于 2010-10-15T15:27:59.620 回答