概要
先日、運用しているWEBシステムにて、突然クッキーに値が保存されなくなった。
小一時間原因を調べたことろ、クッキーに保存可能なデータ長をオーバーしていたため、値が更新されなくなっていたことがわかった。
クッキーのデータサイズ上限
ブラウザの種類やバージョンによって異なる。
Google Chromeは4096byteまで保存可能、最近のIEはそれ以上保存可能なので、基本的には4096byte以内にしておけば問題ない。
参考サイト
http://browsercookielimits.squawky.net/
なお、もともとセットされていたcookieは上書きされない。
少しずつクッキーのサイズが増えていき、あるタイミングで上限サイズを超えた場合、最後の値のまま更新されなくなる。
対処方法
クッキーとして保存する値をいくつかに分けるなど、いろいろな方法があると思うが、運用中のシステムでそのあたりの仕様を変更するのは難しいと思う。
私の場合は、クッキーへの保存時に文字列を圧縮し、クッキーから値を取得する際に解凍するようにした。
// 保存
setcookie("hoge", gzcompress($value), time()+360000000, '/');
// 取得
$value = gzuncompress($_COOKIE['hoge']);
配列の場合、保存時はシリアライズしてから圧縮し、取得時は解凍してからアンシリアライズする。
// 保存
setcookie("hoge", gzcompress(serialize($array), time()+360000000, '/');
// 取得
$value = unserialize(gzuncompress($_COOKIE['hoge']));