作者roga (任性)
看板PHP
标题Re: [请益] 诡异的array key问题
时间Sat Jun 4 15:07:59 2011
: : 感觉上是环境变数的问题
: 查一下你的程式里面有没有 override_function 把 serialize 换掉了。
: : 请问有人遇过相同的问题吗~~~
推 tn801534:我贴的都是真的执行结果喔 ~ 06/04 03:10
→ tn801534:目前好像是发现不同位元的INT_MAX不同的关系 06/04 03:11
建议把 php 版本升起来看看还会不会有问题。
刚刚翻了一下 bugs.php.net 发现 PHP 4 有个问题
"zend_hash_get_current_key_ex returning persistent strings" ,
而 PHP 内部是用 zend_hash_get_current_key_ex() 回传结果来看 hash 的 key
是 HASH_KEY_IS_LONG 或是 HASH_KEY_IS_STRING ,如果一直都回传
HASH_KEY_IS_STRING 就会有可能会出现你说的问题。
(文章底部有原始码连结,你可以 trace 一下流程)
但关於 serialize 的 bug 太多 (快要 500 个),或许是别的 known bug 造成的..
→ roga:32bits/64bits的作业系统 INT_MAX 都是 2147483647 ..
INT_MAX 是看系统定义, 32/64 bit 都是 2147483647
检测方法:
1. 找你系统内的 header file ,定义在 limit.h 里面。
php (php.h) 内部的实作是这样:
#if HAVE_LIMITS_H
#include <limits.h>
#endif
#ifndef LONG_MAX
#define LONG_MAX 2147483647L
#endif
#ifndef LONG_MIN
#define LONG_MIN (- LONG_MAX - 1)
#endif
#ifndef INT_MAX
#define INT_MAX 2147483647
#endif
补充一下 PHP_INT_MAX 这个常数 <?php echo PHP_INT_MAX; ?> ,
其实是来自 php.h 定义的 LONG_MAX ,虽然值和 INT_MAX 看起来一样,
但意义上我想不能归为相同。
补充:2011/06/07 15:27
32bit 的 INT_MAX 和 LONG_MAX 都是 2,147,483,647 所以看起来一样
64bit 的 INT_MAX 是 2,147,483,647
LONG_MAX 是 9,223,372,036,854,775,807
这定义在 limit.h 里面,优先权高於 php.h
补充完毕
2. 你可以看一下 PHP 实作 serialize 的方式:
http://svn.php.net/viewvc/php/php-src/trunk/ext/standard/var.c?revision=306938&view=markup
进入点在 880 行,然後比对一下我前一篇文章。
3. 建议把 os, php 版本附上,最好写个可以 re-produce 的 test case
这样比较容易厘清问题。
--
The Internet: where men are men, women are men, and children are FBI agents.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.220.104.63
※ 编辑: roga 来自: 202.89.121.16 (06/07 15:29)
1F:→ roga:抱歉第一点我讲不清楚,6/7下午补充一下... 06/07 15:29