什么是PHP Year 2038(Y2K38)错误以及如何解决它

本文概述

  • 如何确定我的PHP版本是否容易受到该错误影响?
  • 我需要为此担心吗?
  • PHP的可能解决方案
  • 有兴趣对该错误进行详细说明吗?
到目前为止, PHP开发人员尚未广泛了解Y2K38错误。 2038年的问题, 通常被称为” Unix Millennium Bug” , 其缩写为Y2K38(Y代表Year, 2K代表2000, 年份为38), 该问题导致某些软件在2038年之前或之前发生故障。将系统时间存储为带符号的32位整数(时间戳)的软件和系统(包括PHP), 并将此数字解释为自1970年1月1日00:00:00 UTC以来的秒数。
基本问题是有关计算机的容量以秒为单位计算到特定日期(01-01-2038)之后的时间。由于基于Unix的系统以秒为单位测量从1970年1月1日开始的时间, 因此2038年1月19日的UTC等于1970年1月1日之后的2, 147, 483, 647秒。如果以32位日期和时间存储在系统中, 则系统只能最多可以计算2, 147, 483, 647个单独的正值, 这意味着系统无法继续计算超过该时间的秒数(对于你的应用程序为kaboom)。
如何确定我的PHP版本是否容易受到该错误影响?要确定所使用的PHP版本存在该错误, 可以运行以下脚本:
< ?php// Define a date beyond 2038$dateString = '2039-01-01'; $format = 'l d F Y H:i'; // Parse a textual date/datetime into a Unix timestamp$date = strtotime($dateString); // Print itecho '< span> '. date($format, $date) .'< /span> '; ?>

如果打印的文本是” 2040年2月1日星期三00:00″ , 则说明你的PHP肯定是使用x64版本编译的, 否则” 1970年1月1日星期四01:00″ 表示你的PHP版本有此错误。
我需要为此担心吗?到本文发布之日为止, 我们必须等待20年才能看到此错误如何开始出现在应用程序中。但是, 在那一年, 你的应用程序可能不应该再使用, 因为它应该被视为” 旧版” , 但是我们不能放弃它仍然可以使用。因此, 如果你计划长时间使用你的应用程序, 可能会感到担心, 但是至少不要对它产生偏执。
如你所知(或可能不是), 过去有很多问题, 例如Y2K问题。因此, 比起治疗, 总有办法预防, 不是吗?有两种方法可以防止此问题在你的项目中发生。
PHP的可能解决方案如果满足以下条件, 你将在晚上睡个好觉, 而不必担心2038年应用程序的失败:
1.使用64位操作系统和PHP 64位编译版
如前所述, 支持x64体系结构并使用64位PHP编译版本的操作系统不会出现此问题。在2038年及之后, 此数字将超过231用32位系统上的有符号长整数表示的最大数字, 从而导致2038年问题。由于64位系统中的长整数使用64位, 因此在使用LP64模型的64位系统上不存在此问题。
你可以在某些Web服务(如writephponline)上测试与本文开头提到的代码段相同的代码, 以识别问题, 因为它们使用基于x64的PHP版本, 因此你会看到正确的日期。
2.使用DateTime代替使用Unix时间戳的函数
如果你的PHP代码使用strtotime函数来操纵时间, 请尝试避免使用它。 PHP在版本5.2(整个版本为5.3)中引入了DateTime类, 该类修复了由unix millenium问题引起的错误。这样, 你就不需要运行带有64位编译版PHP的x64位系统。例如, 尝试运行初始代码段, 但改用DateTime类:
< ?php // Define a date beyond 2038$dateString = '2039-01-01'; $format = 'l d F Y H:i'; // Parse a textual date/datetime into a Unix timestamp$date = new DateTime($dateString); // Print itecho '< span> '. $date-> format($format) .'< /span> '; ?>

即使你使用的是x86(32位)PHP版本(至少PHP 5.2), 日期也会按预期显示2040年2月1日(星期三)00:00。 DateTime不受Y2K38问题的困扰, 可以轻松处理9999年12月31日之前的日期。该年度可能(并且希望)不会使用你的系统。
注意, 其他工具(例如MySQL)也是如此(你的数据库应存储datetime或date而不是timestamps)。
有兴趣对该错误进行详细说明吗?这个问题具有很深的背景, 我们在这篇简单的信息文章中不会涉及。因此, 如果你对错误的根源, 详细的描述感兴趣, 我们建议你访问William Porquet的2038.org网站, 主要文章提供了有关该问题的有趣信息。
【什么是PHP Year 2038(Y2K38)错误以及如何解决它】如果你发现此文章有用且有用, 请与你的PHP开发人员朋友分享, 以便他们也知道此错误。

    推荐阅读