phpで稼働しているサービスを32bitから64bitに移行してハマった事

php5.3系のサービスをRedhat系32bitから64bitへ移行した際に若干はまった

phpのarray_sliceやarray_mergeで配列から配列を生成した際にキー値が消失する」 という内容だった。

データを覗いてみるとキー値にintegerを指定してた。

上記の関数はキー値が振られ直すので

http://php.net/manual/ja/function.array-merge.php

そもそも使い方が悪い。というのが前提なのだが 「旧環境では動いてたんじゃ!」と言われると原因を話さないとどうにもならない。

って事で調べてみた。

結論

  • phpはintegerとして扱える文字列が配列のキーとして指定された場合integerにキャストするからね
  • ただし扱える数値以上(PHP_INT_MAX)の値の場合はそのまま文字列として扱うよ

という仕様のためだった。

http://jp.php.net/manual/ja/language.types.array.php http://d.hatena.ne.jp/hnw/20070521

要するに32bit時にはPHP_INT_MAX(2147483647)以上の値をたまたまキーとして指定してたからキーが消失しなかったんだけど、64bitのinteger上限値が9223372036854775807となってしまい、 数値として扱われるようになって関数を噛ました瞬間に添字が振り直されてしまった。

多分余り役に立たない内容だけど、 何かの足しになるかも。と思って記しとく。