我正在寻找检查用户连接速度的可能性。它应该保存为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中,因为已经有输出。
可以在不同的文件中做一些这样的事吗?你有任何解决方案吗?
提前致谢。
答案 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)
答案 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产品开始。
当然,如果您的目标是网站的移动版本,则用户代理嗅探是更好的解决方案。