→ roga:抱歉第一點我講不清楚,6/7下午補充一下... 06/07 15:29
: : 感覺上是環境變數的問題
: 查一下你的程式裡面有沒有 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)