Windows系统下64位PHP中PHP_INT_MAX为32位,bug在php7下修复,时间戳2038问题

[ 2025-05-14 14:48:55 | 作者: admin ]
字号: | |
p.s.时间戳加到2038-01-19 就不可以往上加了,原因是32位的unix时间戳漏洞,称为Y2K38 漏洞。linux下64位的系统不受此影响。
windows下php7以下版本即使操作系统和php都更新到64位还是有这个问题,为彻底解决需要升级php到7以上版本。


在操作系统和php不升级到64位的前提下,解决办法:
PHP下Unix时间戳与日期互转(解决1970年前及2038年后问题,解决32位系统下的int最大长度问题)
//这个问题主要在32位的系统下出现,64位的不存在这样的问题。
//php 5.2+提供了DateTime类来处理这样的问题,参考方案如下(请注意时区的处理):
  
/**
   * 自定义 strtotime 函数,解决32位系统下的int最大长度问题,时间2038年问题
   */

//1、Unix时间戳转日期
function unixtime_to_date($format,$unixtime, $timezone = 'PRC') {
  date_default_timezone_set("Asia/Shanghai");
         $datetime = new DateTime("@$unixtime"); //DateTime类的bug,加入@可以将Unix时间戳作为参数传入
         $datetime->setTimezone(new DateTimeZone($timezone));
         //return $datetime->format("Y-m-d H:i:s");
  return $datetime->format($format);
}


  
//2、日期转Unix时间戳
function date_to_unixtime($date, $timezone = 'PRC') {
  date_default_timezone_set("Asia/Shanghai");
         $datetime= new DateTime($date, new DateTimeZone($timezone));
         return $datetime->format('U');
}
echo date_to_unixtime("Y-m-d","1546419209"); //输出2019-01-02 16:53:29
echo '<br>';
echo unixtime_to_date(date_to_unixtime("2999-1-2 16:53:29")); //输出32472262409



=====================================================================================

相信很多在Windows环境开发的人都遇到一个问题,就是从数据库里取出的int值比64位PHP里面的int值大,导致用intval过滤之后,数值不准确。

Mysql中int分有符号和无符号,有符合的最大值为:2147483647 ,无符号的最大值为:4294967295。

理论上64位的PHP的PHP_INT_SIZE是:8 ,PHP_INT_MAX是:9223372036854775807。

实际上在Linux系统下64位PHP的PHP_INT_MAX的值是:9223372036854775807 ,但是在Windows系统下输出64位PHP的PHP_INT_MAX的值却是:2147483647。

通过查看PHP源码中PHP_INT_SIZE的定义:
REGISTER_MAIN_LONG_CONSTANT("PHP_INT_SIZE", sizeof(long), CONST_PERSISTENT | CONST_CS);

可以看到PHP_INT_SIZE的大小是与C语言的long类型长度一样的。

PHP在Windows平台是用VC++编译的,在Linux平台是用g++编译的。查了一下关于这两个编译器在64位环境的资料:
attachments/202505/14_145148_wechat_20250514_145136_319.jpg


原来在64位编译环境中VC++和g++的long类型长度是有差别的。所以Windows下64位的PHP的int会比Mysql中无符号的int小。


PHP7中对代码做了修改,应该不会再出现这个问题了。
REGISTER_MAIN_LONG_CONSTANT("PHP_INT_SIZE", SIZEOF_ZEND_LONG, CONST_PERSISTENT | CONST_CS);






来源:https://www.cnblogs.com/lxwphp/p/15452494.html
[最后修改由 admin, 于 2025-05-14 15:46:51]
评论Feed 评论Feed: http://blog.xg98.com/feed.asp?q=comment&id=2999

这篇日志没有评论。

此日志不可发表评论。