peclのjsonはnumber型をintに桁落ちする
2010 年 1 月 27 日
コメントはありません
いろいろな制約の関係でCentOS5系のPHP5.1.6でjsonの処理を行わなければならず、Jsphonだとパフォーマンス的に厳しいのでpeclのjsonを利用することになりました。
利用していたところ、mumber型がint型に桁落ちする現象に遭遇。
$ php -r "var_dump(json_decode('{\"id\":8271518654}'));"
object(stdClass)#1 (1) {
["id"]=>
int(2147483647)
}
調べてみたところ、PHP5.2.1の時代にバグレポートされてその後fixされたが、peclにはバックポートされてないようでした。
PHP Bugs: #41567: json_encode double conversion is inconsistent with PHP
バグレポートを参考に修正し、phpizeしてみましたが変わらず。
PHP5.2で取り込まれてるわけですが、そこでphpizeすればいけるんじゃ?ということで5.2.3のソースをダウンロードしphpize後make成功したのでインストールしてみましたが件の件は修正されていませんでした。
結局、PHP5.2.4で修正されていることを確認したのでここに軟着陸。
$ cd /usr/local/src
$ wget http://museum.php.net/php5/php-5.2.4.tar.gz
$ tar zxf php-5.2.4.tar.gz
$ cd php-5.2.4/ext/json
$ phpize
$ ./configure
$ make
$ sudo make install
$ php -i | grep json
$ php -r "var_dump(json_decode('{\"id\":8271518654}'));"
object(stdClass)#1 (1) {
["id"]=>
float(8271518654)
}
make通ったのはPHP5.2.9まで、PHP5.2.5~PHP5.2.9はjson_encodeで問題が見つかった為結局PHP5.2.4のを利用することに。
もうちょい時間があったらしっかり検証したいとこですが。