PHP的函数时间跳跃()

时间:2010-02-01 11:55:52

标签: php time timestamp

使用PHP的time()函数的时间戳,我用date()向用户显示当前时间。

格式:H:i => 13时57分

但有时似乎有时间飞跃。当我访问该页面时,我的Windows时钟显示为13:40。但我的网站说14:XX。我不知道确切的时间了。

另一个例子:用户访问了“谁在线?”页面在00:16列出的用户的最后一次操作时间为00:39。在每次页面加载时,最后一个操作时间将写入数据库。因此,time()函数必须在00:16返回00:39,并且必须将错误的值写入数据库。

这怎么可能发生?

非常感谢你的帮助:))

  

编辑#1 我已将代码缩减为对此问题很重要的部分:

     

我在serverData.php中将时间戳保存为$ tStamp = time()的新变量,此文件包含在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 / Jan / 2010:00:38:41 +0100] ......

     

我的主持人宣布2010-01-20 00:00-06:00的维修工作。你认为维修被挫败了吗?是否可以在这段时间内第二天进行维护工作?这样的工作会让时间错误吗?

     

编辑#3 最后,我有来自我的主机的答案:)在给定的时间段内,服务器崩溃了。因此,手表/时钟停止了。就是这么简单,但我没想到服务器崩溃。非常感谢大家!

9 个答案:

答案 0 :(得分:10)

在评论中阅读了所有这个问题和你的回答后,我可以说这是PHP中的一个错误的可能性非常小。 PHP的time()直接从操作系统中提取,直接从主板上的硬件时钟中提取。由于您正在使用共享主机,因此如果发生这种情况经常发生问题,您将不得不要求主机查看它。它可能是一个流氓的NTP服务器或进程,它可能是硬件时钟的某种短缺 - 无法访问服务器日志或物理访问计算机,我所知道的并不是你可以做的很多。

答案 1 :(得分:3)

作为一个非常远的选项,可能存在一个糟糕的ntp位置,它会在检查时暂时改变系统时间。在下次更新到正确的服务器时,它将被设置回正确的时间。我不认为系统时间可能会漂移那么多。

答案 2 :(得分:2)

请记住,time()会返回服务器时间而不是你的时间。如果它返回不同的值,则表示服务器时间与您的pc时间不同。

答案 3 :(得分:1)

这可能是一个缓存问题,加上设置为另一个时区的服务器 - 提前一小时似乎最有可能用于示例。

Turn off the browser's cache,如果服务器有缓存(squid等),请将其关闭,然后重试实验。

要么是这样,要么服务器场有一个或两个节点设置不正确的节点。

答案 4 :(得分:0)

您可以使用date_default_timezone_set()函数在php.ini或运行时配置服务器的时区。

答案 5 :(得分:0)

您的代码可能存在错误。如果可以,请粘贴一些代码。

否则创建一些测试页面,您可以将问题简化为更简单的代码库,并只测试时间函数。这将有助于澄清和隔离任何潜在的问题。你明白我的意思吗?

答案 6 :(得分:0)

我建议将脚本输出与apache日志进行比较,甚至更好 - 还要创建一个日志,该日志会在请求时写下时间值。这是为了排除以下可能性:

某些提供商的缓存网络不会直接将内容从您传送到网站,而是缓存它,希望其他人也会要求同一页面,然后他们可以节省外部带宽。因此,如果此网络出现故障,您可能会收到错误版本的页面。

与apache日志或syslog相比,可以帮助您了解其他代码是否与代码具有相同的时间概念 - 这消除了代码问题的可能性,并可能将其从php领域转移到服务器领域。如果是这样的话,我会仔细研究ntp - 它是我知道的唯一一个应该与时间混乱的守护进程。

答案 7 :(得分:0)

该方法是通过PHP获取服务器的时间并注入客户端javascript,将其转换为 GMT 时间并添加偏移量,从而将时间转换为您的时区。 See this for more info.

答案 8 :(得分:0)

服务器场上设置时间不正确的恶意节点肯定可以做到这一点(正如@wallyk所建议的那样) - 这比NTP问题更合理。

查看是否有任何方法可以识别您的请求所服务的节点。

尝试在HTML注释中包含php_uname()或gethostname(),并检查时间不正确的页面源。这些可能提供足够的信息来确定问题是否与特定节点相关联。

或创建一个页面,打印函数调用的结果以及当前时间()并编写一个脚本,该脚本多次获取该页面,直到观察到异常。 (显然你会小心避免页面被缓存,并首先向自己保证php_uname()或gethostname()提供了足够的信息来确定不同的节点是否正在处理不同的请求)