2009年5月28日木曜日

XCのセッション管理

XoopsCube向けモジュールを開発中なのですが、セッション周りで少しハマってしまいました。


【やろうとしていたこと】


wizardっぽい画面(群)を作成するため、それら全てのデータを包括できるようなActionFormクラスを定義しておき、インスタンスをセッションに持っておいてwizardの各画面で入力された値をActionFormに格納するような構造を考えました。


【そういうときフツーは・・・】


こういうとき、つまりPHPでクラス(インスタンス)をセッションに保持する場合には、自分でserializeして$_SESSIONに格納するようプログラムを書きます。


【しかし、こんな現象が・・・】


なので、今回もそのようにしたのですが・・そうすると何故か、セッションに格納した他の変数が欠落して取得できなくなってしまい、プログラムが正常に動作しなくなりました。

欠落したのは、一番最後にセッションに格納されるデータ=画面formに埋め込むtokenです。


【調査開始】


今回、firefoxで確認していたので、firefoxで「セッションが保存されない」と来ればローカルに保存されたクッキーが何かの拍子に破壊されたとかそういうのが考えられます。そのため、真っ先にクッキーを一度削除してからfirefox再起動による再作成を行いましたが、現象は変わりません。。。
※この辺りで、正直、頭を抱えてしまいました。


【さらに詳しく調査】


XoopsCubeでは、セッションに格納したデータはDBテーブルに書き出されるようですので、該当テーブルを参照にいくと、最後にセッションに格納したハズのデータが確かに欠落しています。DB保存した段階で既に。

該当テーブルの中でセッションデータを保持するフィールドはtext型で定義されていました。MySQLでtext型というのは最大で65535byteを格納できる、かなり大きなフィールドです。

で、今回私が格納しようとしたデータをみると、クラス自体がかなり入り組んだ構造になっているため、そのまんまシリアライズ化すると、入れ子入れ子の連続で、かなり大きなサイズになっているだろうことが容易に予測されました。


【このように対策しました】


ActionFormをそのまんまシリアライズするのをやめて、各フィールドの値だけを配列に抜き出してきて、それをセッションに格納するようにプログラムを修正したところ、たちどころに、見事に、解決してしまいました。(めでたしめでたし?)


【少し考え事。。。】


どう考えてもActionFormをそのままセッションに持てたほうがプログラム的にはスッキリするとは思うのですが、セッションデータをDBに保存することを考えると、やはりあまり巨大なデータを格納することはできないと考えるほうが正解だろうと思うようになりました。

※そもそも何故セッションデータをDBに保存するのかについては、ネットで調べれば、参考になる情報が実にたくさん見つかります。

今までオレオレ・プログラムを書いたりするときには、ついついセッションを安易にファイルに格納するようにばかりしていたため、思わぬところで先入観に縛られてしまっていました。

反省しきりです。。。

0 件のコメント:

コメントを投稿

どうかお気軽にコメント頂ければ幸いです。