Используя временную метку функции времени () PHP, я показываю текущее время для пользователя с датой ().
Формат: H: i => 13:57
Но иногда вовремя появляются скачки. Мои окна были показаны 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 / янв. / 2010: 23: 34: 53 +0100] …
127.0.0.1 – – [20 / янв / 2010: 23: 34: 55 +0100] …
127.0.0.1 – – [21 / Январь / 2010: 00: 38: 41 +0100] …
127.0.0.1 – – [21 / Январь / 2010: 00: 38: 41 +0100] …
Мой хост объявил об обслуживании на 2010-01-20 00: 00-06: 00. Считаете ли вы, что обслуживание было восстановлено? Может ли быть так, что работа по техническому обслуживанию была проведена на следующий день в этот период? Может ли такая работа ошибиться?
Редактировать # 3 Наконец, у меня есть ответ от моего хостера 🙂 В данный период времени сервер разбился. И из-за этого часы / часы остановились. Это было так просто, но я не думал о сбое сервера. Благодарю всех вас!
Прочитав весь этот вопрос и ваши ответы в комментариях, я могу сказать, что вероятность того, что это ошибка в PHP, довольно бесконечно мала. time()
PHP time()
вытягивается непосредственно из ОС, которое тянет непосредственно с аппаратных часов на системной плате. Поскольку вы находитесь на общедоступном хостинге, вам придется попросить вашего хоста изучить его, если это происходит достаточно часто, чтобы быть проблемой. Это может быть мошеннический NTP-сервер или процесс, он может быть чем-то коротким в аппаратных часах – без доступа к журналам сервера или физическому доступу к компьютеру, не так много, что вы можете сделать лично, что я знаю.
В качестве действительно удачного варианта может быть неправильное местоположение ntp, которое временно меняет системное время, когда оно проверяется. Вернемся к правильному времени следующего обновления на правильный сервер. Я не думаю, что системное время, скорее всего, значительно снизится.
Помните, что time () возвращает время сервера, а не ваше. Если он возвращает другое значение, это означает, что время сервера отличается от времени вашего ПК.
Это может быть проблема кэширования, усугубленная сервером, установленным в другой часовой пояс – на один час вперед, скорее всего, будут показаны примеры.
Отключите кеш браузера , и если у сервера есть кеш ( кальмар и т. Д.), Выключите его и повторите эксперимент.
Либо это, либо ферма серверов имеет узел или два с неправильно установленным временем.
Вы можете настроить часовой пояс своего сервера в php.ini или во время выполнения с помощью функции date_default_timezone_set ().
Возможно, в вашем коде есть ошибка. Пожалуйста, вставьте код, если сможете.
В противном случае создайте несколько тестовых страниц, где вы уменьшите проблему до более простой базы кода и просто проверите функции времени. Это поможет прояснить и изолировать любые потенциальные проблемы. Вы понимаете, что я имею в виду?
Я бы предложил сравнить вывод сценария с журналом apache или даже лучше – также создать журнал, в котором будет записываться значение времени, когда оно запрашивается. Это должно исключить следующую возможность:
Некоторые из провайдеров имеют сети кэширования, которые не доставляют контент прямо от вас на сайт, но кэшируют его вместо этого, в надежде, что кто-то еще попросит одну и ту же страницу, а затем они смогут сэкономить внешнюю полосу пропускания. Таким образом, вы можете получить неправильную версию страницы, если в этой сети есть какие-то сбои.
Сравнение с журналом apache или syslog поможет вам понять, имеет ли другой код то же представление о времени, что и ваш код, что исключает возможность возникновения проблемы с кодом и, вероятно, выведет его из области php в область сервера. Если это так, я бы внимательно посмотрел на ntp – это единственный демон, который я знаю, который, как предполагается, возится со временем.
Метод заключается в том, чтобы получить время вашего сервера с помощью PHP и внедрить в javascript на стороне клиента, преобразовать его в GMT и добавить смещение, таким образом, изменив время на время вашего часового пояса. См. Это для получения дополнительной информации .
Мошеннический узел с некорректно установленным временем на ферме серверов определенно может это сделать (как было предложено @wallyk) – и это гораздо более правдоподобно, чем это проблема NTP.
Посмотрите, есть ли способ определить, с каким узлом ваш запрос обслуживается.
Попробуйте включить php_uname () или gethostname () в комментарий HTML и изучить источник страницы, где время неверно. Они могут дать достаточно информации, чтобы определить, связана ли проблема с конкретным узлом.
Или создайте страницу, которая выводит результаты вызова функции вместе с текущим временем () и записывает скрипт, который получает эту страницу несколько раз, пока не будет обнаружена аномалия. (Очевидно, вы были бы осторожны, чтобы избежать кэширования страницы и сначала убедитесь, что php_uname () или gethostname () дали достаточно информации, чтобы определить, обрабатываются ли разные запросы разными узлами)