Скачок во времени в функции PHP time () - PullRequest
2 голосов
/ 01 февраля 2010

Используя временную метку функции PHP time (), я показываю текущее время пользователю с помощью date ().

Формат: H: i => 13: 57

Но иногда, кажется, скачки во времени. Мои часы Windows показывали 13:40, когда я зашел на страницу. Но мой сайт сказал 14: XX. Я не знаю точное время больше.

Другой пример: пользователь зашел на страницу «Кто в сети?» в 00:16. Пользователь был указан со временем его последнего действия 00:39. Время последнего действия записывается в базу данных при каждой загрузке страницы. Таким образом, функция time () должна вернуть 00:39 в 00:16, и в базу данных должно быть записано неправильное значение.

Как это могло произойти?

Большое спасибо за вашу помощь:)

Редактировать # 1 Я сократил свой код до частей, которые важны для этой проблемы:

Я сохраняю метку времени в новой переменной с $ tStamp = time () в serverData.php, и этот файл включается в index.php, где я показываю время пользователю с датой ('dmY, H: i', $ TSTAMP). Переменная $ tStamp не изменяется ни в одной другой строке.

Редактировать # 2 Пользователи на моем сайте заметили неправильное время 2010-01-21 00:16, где на странице очень быстро показывалось 00:39. Я просмотрел файлы журналов, и примерно в это время в логах отсутствует один полный час:

127.0.0.1 - - [20 / Jan / 2010: 23: 34: 53 +0100] ...

127.0.0.1 - - [20 / Jan / 2010: 23: 34: 55 +0100] ...

127.0.0.1 - - [21 / Jan / 2010: 00: 38: 41 +0100] ...

127.0.0.1 - - [21 / января / 2010: 00: 38: 41 +0100] ...

Мой хостер объявил о техобслуживании на 2010-01-20 00: 00-06: 00. Вы думаете, что обслуживание было отложено? Может ли быть так, что ремонтные работы были выполнены на следующий день в этот период времени? Может ли такая работа сделать неправильное время?

Редактировать # 3 Наконец-то у меня есть ответ от моего хостера :) За указанный период времени сервер вышел из строя. И из-за этого часы / часы остановились. Это было так просто, но я не думал о сбое сервера. Большое спасибо всем вам!

Ответы [ 9 ]

10 голосов
/ 11 февраля 2010

Прочитав весь этот вопрос и ваши ответы в комментариях, я могу сказать, что шансы на то, что это ошибка в PHP, довольно бесконечно малы. PHP time() получает напрямую из операционной системы, которая работает прямо с аппаратных часов на материнской плате. Поскольку вы пользуетесь виртуальным хостингом, вам нужно будет попросить своего хоста изучить его, если это происходит достаточно часто, чтобы стать проблемой. Это может быть мошеннический NTP-сервер или процесс, это может быть какая-то нехватка аппаратных часов - без доступа к журналам сервера или физического доступа к компьютеру не так уж много вы можете сделать лично, о чем я знаю.

3 голосов
/ 01 февраля 2010

В качестве очень далекого варианта может быть неправильное местоположение ntp, которое временно меняет системное время при его проверке. При следующем обновлении будет установлено правильное время на правильном сервере. Я не думаю, что системное время, скорее всего, будет дрейфовать.

2 голосов
/ 01 февраля 2010

Помните, что time () возвращает сервер время, а не ваше. Если он возвращает другое значение, это означает, что время сервера отличается от времени вашего компьютера.

1 голос
/ 09 февраля 2010

Это может быть проблема кеширования, усугубляемая тем, что сервер настроен на другой часовой пояс - для примеров наиболее вероятным будет час вперед.

Отключите кеш браузера , и если на сервере есть кеш ( squid и т. Д.), Отключите его и повторите попытку.

Либо так, либо в ферме серверов есть один или два узла с неправильно установленным временем.

0 голосов
/ 14 февраля 2010

Мошеннический узел с неправильно установленным временем в ферме серверов может определенно сделать это (как предложено @wallyk) - и это гораздо более правдоподобно, чем проблема NTP.

Посмотрите, есть ли способ определить, каким узлом обслуживается ваш запрос.

Попробуйте включить php_uname () или gethostname () в комментарии HTML и изучить источник страницы, на которой указано неправильное время. Эти могут дать достаточно информации, чтобы определить, связана ли проблема с конкретным узлом.

Или создайте страницу, которая печатает результаты вызова функции вместе с текущим временем (), и напишите скрипт, который получает эту страницу несколько раз, пока не наблюдается аномалия. (Очевидно, вы должны быть осторожны, чтобы избежать кэширования страницы, и сначала убедитесь, что php_uname () или gethostname () дали достаточно информации, чтобы определить, обрабатывались ли разные запросы разными узлами)

0 голосов
/ 11 февраля 2010

Метод заключается в том, чтобы получить время вашего сервера с помощью PHP и вставить его в клиентский javascript, преобразовав его в GMT время и добавив смещение, таким образом, преобразовав время в часовой пояс. Подробнее см. .

0 голосов
/ 11 февраля 2010

Я бы предложил сравнить вывод скрипта с журналом apache или, что еще лучше, создать журнал, который бы записывал значение времени при запросе. Это исключает следующую возможность:

Некоторые провайдеры имеют сети кеширования, которые не доставляют контент непосредственно от вас на сайт, а вместо этого кешируют его, в надежде, что кто-то еще попросит ту же страницу, и тогда они смогут сэкономить вне полосы пропускания. Так что вы можете получить неправильную версию страницы, если в этой сети есть какой-то сбой.

Сравнение с apache log или syslog поможет вам понять, имеет ли другой код такое же представление о времени, что и ваш код, - что исключает возможность того, что это будет проблемой кода, и, вероятно, переносит его из области php в область сервера. Если это так, я бы внимательно посмотрел на ntp - это единственный демон, которого я знаю, который должен связываться со временем.

0 голосов
/ 01 февраля 2010

Возможно, в вашем коде есть ошибка. Пожалуйста, вставьте код, если можете.

В противном случае создайте несколько тестовых страниц, где вы уменьшите проблему до более простой базы кода и просто протестируете функции времени. Это поможет прояснить и изолировать любые потенциальные проблемы. Вы понимаете о чем я?

0 голосов
/ 01 февраля 2010

Вы можете настроить часовой пояс вашего сервера в php.ini или во время выполнения с помощью функции date_default_timezone_set ().

...