[`evernote` not found]
LINEで送る
email this
GREE にシェア

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)

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

[`evernote` not found]
LINEで送る
email this
GREE にシェア