【问题标题】:PHP Speed Test for user connection speed without echo in current pagePHP Speed Test 测试当前页面中没有回显的用户连接速度
【发布时间】:2010-10-15 14:10:56
【问题描述】:

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

可以在不同的文件中执行类似的操作吗?你有什么解决办法吗?

提前致谢。

【问题讨论】:

  • 我认为使用原始 php 是不可能的。
  • 添加 512 的 str_pad() 是什么。用于?
  • 坏主意;你不能准确地做到这一点,即使你可以,你也不应该这样做。您想要的是一个低带宽和小屏幕友好的移动版网站,并为用户提供使用该移动版的选项

标签: php connection speed-test


【解决方案1】:

你有什么解决办法吗?

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

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

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

【讨论】:

  • 嗯,听起来确实不错。如果需要,这个想法或多或少会提供这个版本。我正在构建的系统是许多网页的基础,如果有大背景等,为用户提供低带宽版本的选择可能会很好。我想我会手动完成,只提供 2 个按钮。不过,感谢所有答案,如果我需要这样做,我知道去哪里找。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    如何使用 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 个是重复的“”。我想最好使用已压缩的二进制数据

    【讨论】:

      【解决方案4】:

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

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

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

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

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

      【讨论】:

      • 他需要 在生成页面之前的速度,以便他可以选择要包含的 CSS 文件。
      • @Alin Purcaru:请告诉我,您如何在下载任何内容之前获得速度?
      • @fabrik:精度还可以——足以决定快/慢版本。它总是取决于其他因素——用户是否使用浏览器做其他事情,是否有其他传输,等等。
      • @Alin Purcaru:我们可以专注于问题而不是拖钓吗?谢谢你。我了解他正在尝试测量速度并给出高速/低速版本;但是,没有很好的方法来解决这个问题 - AJAX 措施仅对 以下 页面有用;对于第一页,恐怕没有有用的方法既可以测量速度又可以根据测量值做一些有用的事情。不要以为说“使用 AJAX”自动意味着“它是 web2.0,AJAX 是神奇的让它工作的灰尘”。它有有效的用途。
      【解决方案5】:

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

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

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

      ofc 这并不完美:)

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

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

          【讨论】:

            猜你喜欢
            • 2011-05-03
            • 2011-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多