代码之家  ›  专栏  ›  技术社区  ›  caw

php函数time()中的时间跳跃

  •  2
  • caw  · 技术社区  · 15 年前

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

    格式:H:I=>13:57

    但有时似乎有时间上的飞跃。当我浏览网页时,我的windows时钟显示的是13:40。但我的网站上说14:xx。我不知道确切的时间了。

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

    怎么会这样?

    非常感谢您的帮助:)

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

    我将时间戳保存到serverdata.php中的一个新变量$tstamp=time(),这个文件包含在index.php中,在这里我用日期(d.m.y,h:i,$tstamp)向用户显示时间。变量$tstamp在任何其他行中都没有更改。

    编辑第2页 我网站上的用户注意到在2010-01-21 00:16出现了一个错误的时间,页面在很短的时间内显示了00:39。我查看了日志文件,在这段时间里,日志文件中少了整整一个小时:

    127.0.0.1---[2010年1月20日23:34:53+0100]…

    127.0.0.1---[2010年1月20日23:34:55+0100]…

    127.0.0.1---[2010年1月21日:00:38:41+0100]…

    127.0.0.1---[2010年1月21日:00:38:41+0100]…

    我的主人宣布了2010年1月20日00:00-06:00的维修工作。你认为维修工作被推迟了吗?在这个时间段的第二天做维修工作,可能是这样吗?这样的工作会让时间错吗?

    编辑第3页 最后,我的主人给了我一个答案:)在给定的时间内,服务器崩溃了。因此表/钟停了。很简单,但我没想到服务器会崩溃。非常感谢大家!

    9 回复  |  直到 14 年前
        1
  •  10
  •   Brock Batsell    14 年前

    在阅读了所有这些问题和您在评论中的回答之后,我可以说这是php中的一个bug的可能性非常小。PHP的 time() 直接从操作系统拉,直接从主板上的硬件时钟拉。既然你是在共享主机上,你就得让你的主机去调查它,如果这种情况经常发生,甚至会成为一个问题。它可能是一个流氓的NTP服务器或进程,可能是硬件时钟中的某种短时间——没有访问服务器日志或对计算机的物理访问,据我所知,你个人并不能做很多事情。

        2
  •  3
  •   Cryophallion    15 年前

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

        3
  •  2
  •   mck89    15 年前

    记住time()返回 服务器 时间不是你的。如果返回不同的值,则表示服务器时间与PC时间不同。

        4
  •  1
  •   wallyk    14 年前

    这可能是一个缓存问题,再加上服务器设置到另一个时区——在示例中,提前一小时似乎是最有可能的。

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

    或者服务器场有一两个节点的时间设置不正确。

        5
  •  0
  •   Johannes Gorset    15 年前

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

        6
  •  0
  •   Antony Carthy    15 年前

    代码中可能有错误。如果可以的话,请粘贴一些代码。

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

        7
  •  0
  •   StasM    14 年前

    我建议将脚本输出与apache日志进行比较,或者更好地创建一个日志,在请求时记录时间值。这是为了排除以下可能性:

    一些提供商拥有缓存网络,这些网络不会直接将内容从您的站点发送到您的站点,而是缓存它,希望其他人也会要求相同的页面,然后他们可以节省外部带宽。所以如果这个网络有问题的话,你可能会得到一个错误的页面版本。

    与ApacheLog或Syslog相比,可以帮助您了解其他代码是否与您的代码具有相同的时间概念—这就消除了它成为代码问题的可能性,并可能将它从PHP领域带到服务器领域。如果是这样的话,我会仔细研究ntp——它是我所知道的唯一一个会扰乱时间的守护进程。

        8
  •  0
  •   Sarfraz    14 年前

    方法是通过php获取服务器的时间并注入到客户端javascript中,将其转换为 格林尼治时间 时间,并添加偏移量,从而将时间转换为时区的时间。 See this for more info .

        9
  •  0
  •   MZB    14 年前

    服务器场上时间设置不正确的恶意节点肯定会这样做(正如@wallyk所建议的那样),而且这比ntp问题更合理。

    查看是否有任何方法可以确定您的请求由哪个节点提供服务。

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

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