我想使用我网站的访问者收集一些信息。
我需要的是让每个访问者 ping 3 个不同的主机名,然后将以下信息保存到数据库中。
Visitor IP, latency 1,latency 2, latency 3
当然,一切都必须对访客透明,而不会以任何方式打扰他。这可能吗?能给我举个例子?是否有任何 jQuery 插件或其他使其更容易的插件
编辑
到目前为止,这就是我所拥有的jsfiddle.net/dLVG6,但数据太随机了。它从 50 跳到 190
我想使用我网站的访问者收集一些信息。
我需要的是让每个访问者 ping 3 个不同的主机名,然后将以下信息保存到数据库中。
Visitor IP, latency 1,latency 2, latency 3
当然,一切都必须对访客透明,而不会以任何方式打扰他。这可能吗?能给我举个例子?是否有任何 jQuery 插件或其他使其更容易的插件
编辑
到目前为止,这就是我所拥有的jsfiddle.net/dLVG6,但数据太随机了。它从 50 跳到 190
这将比你想象的更痛苦。
您的第一个问题是 Javascript 没有 ping。Javascript 最擅长的是 HTTP 和一些表亲协议。
第二个问题是您不能只发出一些 ajax 请求并对结果进行计时(这太明显了)。同源策略将阻止您使用 ajax 与页面来源以外的服务器通信。您需要使用 JSONP,或者更改图像标签的 src,或者其他更间接的方法。
您的第三个问题是您不想做任何会导致返回大量数据的事情。您不希望数据传输时间或大量服务器处理干扰测量延迟。
第四,您不能要求可能被缓存的 URL。如果对象碰巧在缓存中,您将获得非常低的“延迟”测量值,但它没有意义。
我的解决方案是使用没有src
属性的图像标签。在文档加载时,将 设置src
为指向有效服务器但使用无效端口。通常,服务器简单地拒绝您的连接比生成正确的 404 错误响应要快。然后,您所要做的就是测量从图像中获取错误事件需要多长时间。
从小提琴:
var start = new Date().getTime();
$('#junkOne').attr('src', 'http://fate.holmes-cj.com:8886/').error(function () {
var end = new Date().getTime();
$('#timer').html("" + (end - start) + "ms");
});
这项技术可能会得到改进。这里有一些想法:
使用 jQuery,您可以:
$.ajax(url,settings)
( http://api.jquery.com/jQuery.ajax/ ) 并通过 via 花费时间beforeSend
,complete
减去Date.now()
这些时间 -> 然后您有时间进行请求(不完全是“Ping”尽管)
2021年:
再次为我正在构建的 React 应用程序尝试了这个。我不认为准确性太高。
const ping = () => {
var start = new Date().getTime();
api.get('/ping').then((res) => {
console.log(res)
var end = new Date().getTime();
console.log(`${end-start} ms`)
}, (err) => {
console.log(err)
})
};
编写了我自己的小 API,但我想在请求期间发生的事情太多了。
在终端中,我得到大约 23 毫秒的 ping 到我的服务器.. 使用它可以达到 200-500 毫秒。