福岡のIT系の会社で働くエンジニアのブログです。

技術雑記

[Perl][CPAN] CGI::Sessionで勝手にSessionIDが変わる件について

Twitter bookmark Facebook LINE Pocket Feedly RSS

CGI::Session
CGI::Session

自分が以前に作った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)



ウーン、こんな簡単なこと気がつくのに四苦八苦したなんて、精神的に疲れた…。

Twitter bookmark Facebook LINE Pocket Feedly RSS