【问题标题】:PHP getdate() error moving from PHP 5.2 to 5.3PHP getdate() 错误从 PHP 5.2 迁移到 5.3
【发布时间】:2016-02-17 16:30:06
【问题描述】:

我遇到了这里描述的相同问题,时区错误:

PHP Configuration: It is not safe to rely on the system's timezone settings

我想与我的托管服务进行建设性的对话。所以我自己做了一些挖掘,首先。这是一个 Apache 服务器,我不确定它在哪个操作系统上。

我的 phpinfo() 声明如下:

Loaded Configuration File   /usr/local/php53/lib/php.ini

这个,对于时区:

date/time support   enabled
"Olson" Timezone Database Version   2013.3
Timezone Database   internal
Default timezone    America/Chicago

因此,乍一看似乎时区设置正确。然而我仍然得到错误:

getdate() [function.getdate]: It is not safe to rely on the system's
timezone settings. You are *required* to use the date.timezone setting
or the date_default_timezone_set() function. In case you used any of
those methods and you are still getting this warning, you most likely
misspelled the timezone identifier. We selected 'America/Chicago' for
'CST/-6.0/no DST' instead

我预计我的主机会告诉我“抱歉,设置正确 - 请更新您的应用程序以解决此错误”。

我应该让他们逃避那个答案,还是应该强迫他们去检查以 /cli/php.ini 结尾的另一个位置的设置?

我想我不明白在我的情况下该文件在哪里,或者如果 phpinfo() 说正在加载的唯一 ini 文件位于 /usr/local/php53/lib/php ,为什么它甚至会被引用.ini

任何理解这一点的帮助将不胜感激。我讨厌在没有彻底了解问题的情况下与我的房东交谈,我自己。

【问题讨论】:

  • 您提到了 CLI。那是错误出现的地方吗?通常,CLI 和 Web 服务器有不同的 php.ini 文件。
  • 这就是我缺乏知识的地方。我提到 CLI 只是因为我链接的另一个线程(在我的问题中)谈到了它。我不明白那是什么或它做了什么,或者我是否应该向我的托管服务询问它。

标签: php php-5.3 getdate


【解决方案1】:

出现这种情况的原因是,在 5.3 版本中,PHP 开发人员决定要求在 PHP.ini 文件(或在 .htaccess 中,或使用 date_default_timezone_set())中明确设置时区。这样做的原因是早期 PHP 版本存在一个明显的问题,其中时区未设置,人们依赖的默认值通常不正确(例如,因为他们使用不同时区的托管服务器)。有大量由此引起的严重问题,要求明确设置是为了解决这些问题。

解决方案是确保您的 PHP.ini 文件包含时区设置。如果您在共享主机上并且无法更新 PHP.ini,那么您可以将其设置在本地 .htaccess 文件中(假设您在 Apache 服务器上;其他服务器软件可能会有所不同)。如果你不能在那里设置它,那么你必须在代码中设置它。

您的主机显然没有在 PHP.ini 中设置时区。鉴于服务器只是从 PHP 5.2 升级而来,这并不奇怪。 5.2 不需要设置(默认从系统时区开始),所以很容易在升级过程中遗漏。

从您的角度来看,您可以通过在 .htaccess 中设置时区来完全避免与主机对话。只需使用以下行创建一个 .htaccess 文件(或编辑现有文件):

php_value date.timezone "America/Chicago"

但是,理想情况下,它确实应该在 PHP.ini 文件中设置,如果这是在您的主机控制下,那么您最好与他们一起提出它——而不是设置它一个非常明显的迹象表明他们对 PHP 并不真正了解,而且他们当然没有在升级后实际测试过他们的配置。这应该让你担心,因为可能有其他问题正等待着你; PHP 在 5.2 和 5.3 之间发生了一些重大变化,许多功能被弃用,默认配置值发生了变化,您和您的主机在进行此升级时确实需要注意这些。

有趣的是,这个时区警告的决定实际上正在被撤销:随着即将发布的 PHP 7.0 版本,您将不再需要在 PHP.ini 中明确指定时区。您可以在此处阅读有关此更改的更多信息:https://wiki.php.net/rfc/date.timezone_warning_removal。这显然暂时不会影响您,但它仍然很有趣。

在我回答时,我想重申一下上面的段落——即下个月发布 PHP7——并指出您正在升级到一个已经过时的 PHP 版本。

一年多前(2014 年 8 月),PHP 5.3 被宣布终止,此后没有任何更新。甚至 PHP 5.4 现在也已结束(尽管这才刚刚发生)。我真的很高兴听到您正在远离 5.2,但您不应该满足于 5.3:我强烈建议您现在进一步升级,同时您无论如何都要进行升级工作,因为否则以后会花费你更多的时间。

我不建议一直升级到 PHP7,但您应该将 5.4 视为绝对最低版本,并将 5.5 或 5.6 视为当今的首选版本。到目前为止,升级最大的痛苦是从 5.2 到 5.3,所以你已经完成了艰苦的工作;现在升级一两个版本几乎没有任何额外的工作,而您仍然在这样做。

【讨论】:

  • 谢谢...我可能可以进入 5.4,但由于某种原因,我使用的购物车系统在 5.5 上失败了。除非我可以自己为 5.4 到 5.5 的跳转重新调整购物车 PHP 代码,否则我将在 5.4 上停留很长时间。
  • 另外,我的 phpinfo() 似乎显示默认的 is 设置...所以我仍然不明白为什么我什至会收到此错误(请参阅我的原始上面的帖子/问题...)
  • 重新代码在 5.5 上失败...这应该没什么大不了的; 5.4 和 5.5 之间的兼容性中断非常小(请参阅php.net/migration55),因此应该很容易找到问题。 (你不希望永远被固定的 PHP 版本卡住,不管它是哪个版本......你离开它的时间越长,后续升级就越困难——正如你现在发现的那样)
  • 重新设置默认值:嗯,PHP 5.3 仍然会从操作系统中获取默认值,即使它没有在 php.ini 中设置,就像 PHP 5.2 过去那样,所以从这个角度来看什么也没有变。不同之处在于 5.3 现在发出警告消息。除了消息之外,功能是相同的,因此您仍然会看到设置了默认值,因为它已设置。
  • 感谢您出色的分析/建议,辛巴。我现在是 5.3,是的,我将专注于尽快达到 5.5。
【解决方案2】:

你需要设置你的时区

date_default_timezone_set('Europe/London');

http://php.net/manual/en/function.date-default-timezone-set.php

【讨论】:

  • 这确实解决了问题,但我肯定会让网络主机在php.ini 中设置默认值,而不是在每个 PHP 脚本中都这样做。
  • 对。我确实将函数调用添加到应用程序的 config.php - 这将有效地解决问题,但我想了解为什么首先会出现问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-10
  • 2017-04-11
  • 2017-06-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多