自分が以前に作った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)
ウーン、こんな簡単なこと気がつくのに四苦八苦したなんて、精神的に疲れた…。
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://blog.kaburk.com/lang/perl/cgi-session-change-session-id.html/trackback
- Listed below are links to weblogs that reference
- [Perl][CPAN] CGI::Sessionで勝手にSessionIDが変わる件について from [ま]技術雑記

































