English 中文(简体)
PHP速度测试当前页面中没有回声的用户连接速度
原标题:PHP Speed Test for user connection speed without echo in current page

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

一个人能在另一个文件或其他什么文件中做这样的事情吗?你有什么解决办法吗?

提前谢谢。

最佳回答

你有什么解决办法吗?

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

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

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

问题回答

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

  • Measure users speed
  • Redirect to index

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

如何使用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>

Some pitfalls: - The page would need to start loading first. JQuery would need to be loaded (or you can rework the above code to avoid jQuery)

  • testing speed on ASCII / Latin data may not give the best result, because the characters may get compressed. Besides the high level gzip compression, Some modems / lines (if not all) have basic compression that is able to detect repeating characters and tell the other end that the next 500 are repeat of . I guess it would be best to use binary data that has been compressed

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

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

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

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

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

当您访问第一个页面(可能有100kB的所有外部文件)时,会话立即以

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

when page finished loading(jQuery window load or smth:) u send a request again with time, u compute the speed (jQueryRequestTime - $_SESSION["start_time"] / PageSize) and set another session variable, the next link he clicks then can include custom css/js approved for that

ofc这并不完美:)

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

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

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

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





相关问题
Brute-force/DoS prevention in PHP [closed]

I am trying to write a script to prevent brute-force login attempts in a website I m building. The logic goes something like this: User sends login information. Check if username and password is ...

please can anyone check this while loop and if condition

<?php $con=mysql_connect("localhost","mts","mts"); if(!con) { die( unable to connect . mysql_error()); } mysql_select_db("mts",$con); /* date_default_timezone_set ("Asia/Calcutta"); $date = ...

定值美元

如何确认来自正确来源的数字。

Generating a drop down list of timezones with PHP

Most sites need some way to show the dates on the site in the users preferred timezone. Below are two lists that I found and then one method using the built in PHP DateTime class in PHP 5. I need ...

Text as watermarking in PHP

I want to create text as a watermark for an image. the water mark should have the following properties front: Impact color: white opacity: 31% Font style: regular, bold Bevel and Emboss size: 30 ...

How does php cast boolean variables?

How does php cast boolean variables? I was trying to save a boolean value to an array: $result["Users"]["is_login"] = true; but when I use debug the is_login value is blank. and when I do ...

热门标签