自分が以前に作ったPerlで動いているシステムで、テキストエリアに1000文字ほど入れると、セッションエラーになるというバグらしき報告をもらった。
色々試してみると、確かにある一定の文字数を超えるとエラーになるようでした。
最初は原因がわからず、プログラムのソースコードとにらめっこ。
うーん、わからん。
と、ここで、とある動作の時に途中でセッションが新規作成されて、セッションIDが変わってしまっている!!
原因はこれか。しかし理由がわからない。
CGI::Sessionモジュールのバージョンが古いから、それからみのバグかな?とか疑って色々なバージョンを試してみたり。
※ 現在このシステムでは少々古いバージョンの3.95というバージョンを使っています。
※ 2008/1/10現在の最新は4.20のようです。)
それでも直らない。
困ったなぁ…。
そうだ、セッションはファイルに保存するようにしていたが、途中のバージョンアップで今はMySQLのテーブルに保存しているので、試しに以前のファイルへ保存するスタイルにもどしてみよう!
あれ?ケロッと直った。
てことは、MySQLに保存する時か読み出しのときにおかしくなるのか。
と、テーブルの中身を見てると、セッションデータの最後が切れてる!!
つまり、セッションデータが大きいのにテーブルのカラムのサイズが小さくて、保存時に後ろのデータが消えてしまっていたのでした。
そして、その後ろの切れたデータを読み出したときに、正常にセッションデータとして読み込めないので、自動でセッションが新規作成されていた、というバグでした。
解決方法は、すごく簡単。
MySQLのセッションテーブルのカラムのデータ型をTEXT型からMEDIUMTEXT型に変更して保存できる容量を大きくして、無事に解決しました。
mysql> desc sessions;
+-------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| id | varchar(32) | | PRI | | |
| a_session | text | YES | | NULL | |
| create_time | timestamp(14) | YES | | NULL | |
+-------------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
mysql> ALTER TABLE `sessions` MODIFY COLUMN `a_session` MEDIUMTEXT;
mysql> desc sessions;
+-------------+---------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+-------+
| id | varchar(32) | | PRI | | |
| a_session | mediumtext | YES | | NULL | |
| create_time | timestamp(14) | YES | | NULL | |
+-------------+---------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
ウーン、こんな簡単なこと気がつくのに四苦八苦したなんて、精神的に疲れた…。