Обращайтесь к старой доброй ICMP Timestamp схеме сообщений.Это довольно тривиально для реализации на JavaScript и PHP.
Вот реализация этой схемы с использованием JavaScript и PHP:
// browser.js
var request = new XMLHttpRequest();
request.onreadystatechange = readystatechangehandler;
request.open("POST", "http://www.example.com/sync.php", true);
request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
request.send("original=" + (new Date).getTime());
function readystatechangehandler() {
var returned = (new Date).getTime();
if (request.readyState === 4 && request.status === 200) {
var timestamp = request.responseText.split('|');
var original = + timestamp[0];
var receive = + timestamp[1];
var transmit = + timestamp[2];
var sending = receive - original;
var receiving = returned - transmit;
var roundtrip = sending + receiving;
var oneway = roundtrip / 2;
var difference = sending - oneway; // this is what you want
// so the server time will be client time + difference
}
}
Теперь для кода sync.php
:
<?php
$receive = round(microtime(true) * 1000);
echo $_POST["original"] . '|';
echo $receive . '|';
echo round(microtime(true) * 1000);
?>
Я не проверял приведенный выше код, но он должен работать.
Примечание: Следующий метод позволяет точно рассчитать разницу во времени между клиентом и сервером при условии, что фактическое времяотправлять и получать сообщения одинаково или примерно одинаково.Рассмотрим следующий сценарий:
Time Client Server
-------- -------- --------
Original 0 2
Receive 3 5
Transmit 4 6
Returned 7 9
- Как видите, часы клиента и сервера на 2 единицы не синхронизированы.Следовательно, когда клиент отправляет запрос метки времени, он записывает исходное время как 0.
- Сервер получает запрос спустя 3 единицы, но записывает время приема как 5 единиц, потому что это на 2 единицы впереди.
- Затем он передает ответ с меткой времени на одну единицу позже и записывает время передачи как 6 единиц.
- Клиент получает ответ через 3 единицы (т. Е. При 9 единицах в зависимости от сервера).Однако, поскольку он находится на 2 единицы позади сервера, он записывает возвращаемое время как 7 единиц.
Используя эти данные, мы можем вычислить:
Sending = Receive - Original = 5 - 0 = 5
Receiving = Returned - Transmit = 7 - 6 = 1
Roundtrip = Sending + Receiving = 5 + 1 = 6
Как видно из приведенного вышевремя отправки и получения рассчитывается неверно в зависимости от того, насколько не синхронизированы клиент и сервер.Тем не менее, время туда и обратно всегда будет правильным, потому что мы сначала добавляем две единицы (получи + оригинал), а затем вычитаем две единицы (возвращено - передай).время туда-обратно (т.е. время для передачи - это время для получения, тогда мы можем легко рассчитать разницу во времени следующим образом):
Oneway = Roundtrip / 2 = 6 / 2 = 3
Difference = Sending - Oneway = 5 - 3 = 2
Как вы можете видеть, мы точно рассчитали разницу во времени как 2 единицы,Уравнение для разницы во времени всегда sending - oneway
время.Однако точность этого уравнения зависит от того, насколько точно вы рассчитываете время в пути.Если фактическое время отправки и получения сообщений не равно или приблизительно равно, вам нужно будет найти какой-то другой способ вычисления времени в один конец.Однако для ваших целей этого должно быть достаточно.