【问题标题】:PHP time() returns a timestamp that is 59 seconds behind real timePHP time() 返回一个比实际时间晚 59 秒的时间戳
【发布时间】:2019-09-17 18:02:27
【问题描述】:

我有一个开发环境和一个生产环境。 time() 函数在我的开发环境中返回正确的时间戳,但在我的生产环境中 time() 正好落后 59 秒! 两种环境中的 PHP 版本均为 7.0.3。 这不可能是时区问题,因为差异只有一分钟,并且 PHP 默认时区在两种环境(美国/洛杉矶)中都是相同的。 现在是上午 10:48:29,这是在两种环境中同时调用此函数的输出(或者至少与我在控制台上按 Enter 键一样快)。

开发环境(正确)

php > echo date('h:i:s A');
10:48:29 AM

生产环境(落后一分钟)

echo date('h:i:s A');
10:47:31 AM

time() 函数也是如此

开发环境(正确)

php > echo time();
1568742851

生产环境(落后一分钟)

echo time();
1568742792

1568742851 - 1568742792 = 59 秒

我知道我可以将 59 秒添加到时间戳 time() 返回,但这似乎是一种 hack,并不能解决问题。我想请教一下如何修复我的生产环境。

【问题讨论】:

  • 系统时钟中的一个是否可能没有显示正确的时间?
  • 开发和生产环境是什么意思?这两个不同的操作系统、PC、虚拟机……?如果是这样,您确定它们在几秒钟内具有相同的时间吗?
  • 环境位于不同的服务器中,但操作系统和 PHP 版本相同。 @g_bor 生产环境确实有不同的操作系统级系统时区设置为 UTC。这是 9 小时的差异,而不仅仅是一分钟,所以您认为这可能会导致 PHP 错误计算 UNIX epoc 吗???
  • 不,我不相信。我认为其中一个系统的时间可能会关闭 59 秒。你有独立的方法来询问系统它认为它是什么吗?就像在 tty 中运行日期一样?
  • 是的,我运行了 unix 命令 timedatectl,它显示了生产中使用 UTC 的系统时间。当我运行 php time() 函数时,它只显示了 59 秒,这很奇怪!

标签: ubuntu-16.04 php-7.0


【解决方案1】:

确认您允许 NTP 流量进入您的生产操作系统环境。您可以通过运行以下命令来确认您的服务器与 NTP 正确通信 ntpq -c peers 如果您收到 Connection refused 提示,则表示您没有正确的连接。您需要配置入站防火墙规则,允许端口 123 上的 UDP 流量。完成后,重新启动您的 NTP 服务 service ntpd restart 并重新运行 ntpq -c peers 命令

【讨论】:

  • 这绝对是 NTP 通信问题,这完全解决了!
【解决方案2】:

我相信您的生产和开发机器上的系统时钟不同步,无论 PHP 或操作系统的版本如何,就像评论中提到的 @g_bor 一样。

不要被时区弄糊涂了,只要在系统shell上运行date +%s命令在两台机器上打印时间戳,如果你没有权限(不能用ssh登录),你可以准备PHP文件其中包含system('date +%s');,然后,上传到您的网络服务器并打开浏览器以检查您的两台机器上的时间戳。

【讨论】:

    猜你喜欢
    • 2020-01-12
    • 2017-10-13
    • 1970-01-01
    • 2011-06-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2014-01-03
    相关资源
    最近更新 更多