вот 2 метода, которые вы можете использовать для проверки задержки.
затем вы можете рассчитать время прибытия запроса пользователя
фактическое время запроса = время прибытия запроса - задержка
время прибытия запроса должно быть временем сервера(когда запрос поступает на сервер), поэтому нам не нужно синхронизировать модули.но данные о задержке должны поступать от клиента вместе с данными запроса.Вы должны создать клиентский сценарий для опроса и вычисления среднего времени задержки.
первый метод взят из вопроса здесь в stackoverflow .этот использует AJAX.это самый точный поиск, с отклонением менее 10 мс от фактического.то, что он делает, это вызывает (через ajax) страницу вашего сервера (в этом примере URL-адрес «/» означает ваш веб-корень)
преимущество: мы используем jQuery ajax .success()
который инициирует событие после получения ответа, но до загрузки данных ответа (таким образом, размер запроса не имеет значения)
недостаток: ajax не является междоменным (без помощи).но если у вас есть собственный сервер, никаких проблем.
второй - отсюда , и я немного его изменил.Первоначально он был создан как тестер сервера, чтобы проверить, если сервер все еще там.
преимущества: междоменный (мы используем img = new Image()
метод "preloader image")
недостаток: скорость интернета.Размер полезной нагрузки (в данном случае изображение) и скорость интернета будут иметь значение, поскольку мы используем только .onLoad()
, который срабатывает после загрузки контента.
будет отклонение от 200 до 400 мс, в зависимости от размера изображения.
//this is a static class. values are preserved. do resets before and after use.
var ping = {
//the sample image. make it as small as possible like 1 x 1 px black and white.
//we are only testing ping, not download times
//replace with your own image on your server since this link will die soon
picture: "http://205.196.122.17/vh8cvmdtgfsg/8nsd22kphe1fz5w/spacer.bmp",
//placeholder for test subject
pictureFrame: null,
//timer
timer: null,
reset: function(){
//clear timeouts and timer
clearTimeout(ping.timer);
ping.timer = null;
//clear the picture frame
ping.pictureFrame = null;
},
//start ping function
init: function() {
//reset
ping.reset();
//get time before request
var preSess = new Date();
var preTime = preSess.getTime();
//append current timestamp so request won't be from cache
var pictureUri = ping.picture + "?time=" + preTime;
//create placeholder
ping.pictureFrame = new Image();
ping.pictureFrame.onload = function() {
//get time after load
var postSess = new Date();
var postTime = postSess.getTime();
var requestTime = postTime - preTime;
alert("Ping took "+requestTime+"ms");
//reset
ping.reset();
};
//triggers loading
ping.pictureFrame.src = pictureUri;
//set maximum timeout (in ms) before we declare domain not there
ping.timer = setTimeout("ping.failed()", 60000);
},
//time-out reached
failed: function() {
//reset
ping.reset();
//alert what happened
alert("Ping took too long");
}
};
ping.init();