滚动
32 位 PHP 的限制
如果您在一个 PHP 被编译或限制为使用 32 位整数的系统上运行 Drupal,那么您只能输入 1901 年至 2038 年之间的日期(具体而言,从 1901 年 12 月 13 日 UTC 时间 20:45:52 到 2038 年 1 月 19 日 UTC 时间 03:14:07)。这被广泛称为 2038 年问题。
常见的症状是日期显示或记录为 1970-01-01,而不是超出上述范围的预期值。这会影响所有 PHP 应用程序。特别是在 Drupal 中,它会影响基于日期的字段类型,例如“仅日期”和“日期与时间”,包括“列表选择器”小部件。您可以选择 1900 至 2038 年之外的年份,但由于 PHP 本身无法处理这些日期,它们将在没有任何警告的情况下被保存或显示为 1970-01-01。
受影响的产品
- 官方的 PHP 5.x / 7.x Windows x86 版本和 PHP 5.x x64。
- 任何包含 32 位版本 PHP 的 Web 堆栈包(如 XAMPP、Wamp 等)和/或运行在 32 位系统上的版本。
- Acquia Dev Desktop 2 在 2018 年 6 月 14 日之前的版本(现在已使用 64 位的 PHP 和 MySQL)。
注意:关键在于 PHP 本身是如何编译的。如果您在 64 位操作系统上运行 32 位版本的 PHP,您仍然会遇到此问题。
测试
要检查您的 PHP 是否受到影响,您可以运行以下命令(单行执行):
php -r "echo (date('y',strtotime('2039-01-01')) == 39 ? 'OK' : 'Y2K38 limitation') . PHP_EOL;"
未受影响的 PHP 实例会输出 OK,而存在漏洞的 PHP 实例会输出 Y2K38 limitation。