6

我想使用我网站的访问者收集一些信息。
我需要的是让每个访问者 ping 3 个不同的主机名,然后将以下信息保存到数据库中。

Visitor IP, latency 1,latency 2, latency 3

当然,一切都必须对访客透明,而不会以任何方式打扰他。这可能吗?能给我举个例子?是否有任何 jQuery 插件或其他使其更容易的插件

编辑

到目前为止,这就是我所拥有的jsfiddle.net/dLVG6,但数据太随机了。它从 50 跳到 190

4

3 回答 3

7

这将比你想象的更痛苦。

您的第一个问题是 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");
});

这项技术可能会得到改进。这里有一些想法:

  1. 使用 IP 地址而不是 DNS 主机名。
  2. 多次“ping”,扔掉最高分和最低分,然后平均其余部分。
  3. 如果您的网页正在进行大量繁重的处理,请尝试在您认为 UI 负载最轻的时候进行测试。
于 2013-04-28T23:51:59.777 回答
2

使用 jQuery,您可以: $.ajax(url,settings)( http://api.jquery.com/jQuery.ajax/ ) 并通过 via 花费时间beforeSendcomplete减去Date.now()这些时间 -> 然后您有时间进行请求(不完全是“Ping”尽管)

于 2013-04-28T19:11:00.490 回答
1

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 毫秒。

于 2021-02-08T06:52:23.883 回答