代码之家  ›  专栏  ›  技术社区  ›  Lukas Oppermann

当前页面无回声用户连接速度的PHP速度测试

  •  6
  • Lukas Oppermann  · 技术社区  · 16 年前

    我正在寻找一个可能性,以检查用户连接速度。它应该被保存为一个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 回复  |  直到 16 年前
        1
  •  8
  •   webbiedave    16 年前

    你有什么解决办法吗?

    我的解决办法是根本不用操心速度测试。原因如下:

    只要发送数据,它就会被缓存。除非你有JS/CSS的MBs(在这种情况下你需要重新设计网站,而不是速度测试),否则下载时间是可行的。速度测试应该预留给流视频之类的东西。

        2
  •  3
  •   fabrik    16 年前

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

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

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

        3
  •  1
  •   Allen Hamilton    16 年前

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

    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)

        4
  •  1
  •   Piskvor left the building Rohit Kumar    16 年前

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

    那个

    你可以创建一个“加载”页面(就像你在GMail上看到的,当你从一个慢速连接访问它的时候)来预加载数据,链接到低带宽版本(或者如果加载时间太长,可能会重定向)。

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

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

        5
  •  1
  •   rthrwht    16 年前

    $会话[“开始时间”]=时间();

    当页面完成加载(jQuery window load或smth:)时,您将再次随时间发送请求, u计算速度(jQueryRequestTime-$_SESSION[“start_time”]/PageSize)并设置另一个SESSION变量,他单击的下一个链接可以包含为此批准的自定义css/js

        6
  •  0
  •   Jack Shedd    16 年前

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

        7
  •  0
  •   Ryan Chouinard    16 年前

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

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

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

    推荐文章