FuelPHP / 特定の状況でセッションが消える

FuelPHP / 特定の状況でセッションが消える

FuelPHP 1.7でおこった。原因としてFuelPHPは関係なかったわけだが・・・

事象1 取り出せたり消えたりする

Session::set("hogehoge", $aaa);
Session::get("hogehoge");
Session::set_flash("hogehoge", $aaa);
Session::get_flash("hogehoge");

の操作で状況によってセッションが消えたり、ちゃんと使えたりするというよくわからない挙動をしめした。

消えるというか、入っていなかった、入らなかった、うまく復元できなかった、ということか。

原因

原因は、セッションに突っ込むデータのデカさの問題だった。

FuelPHP1.7ではセッションの実情報(キーではない)の保存先がデフォルトで Cookie になっている。 ブラウザの実装では大体4KBぐらいが Cookie に保存できる限界になっている。 ここでインスタンス等のちょっと大きめのデータをセッションに突っ込むとこの4KBを超えてしまうことになる。

事象としては突っ込むことはできるが、取り出す際にケツが切れているので失敗して取り出したものが null になってしまっていたということだ。

ここで混乱した原因は、状況によってインスタンス内のデータが増減するということだった。ある処理をする前だと正常に取り出せるのだが、した後だと取り出せないという動きになってしまっていた。

処理によりインスタンス内のデータが増減し4KBを超えたり超えなかったりするため、問題が起きたり起きなかったりするというややこしいことになっていた。

解決

セッションの実データの保存先を Cookie から file に移動することにより解決。

方法はまずSessin系の設定値をデフォルトから変えるため

fuel/core/config/session.php

fuel/app/config/

へコピーする。

driverの設定値を変更する。

// if no session type is requested, use the default
// 'driver'			=> 'cookie',
'driver'			=> 'file',

これで4KB以上のインスタンスもSessionに保存可能になり問題は解決する。

事象2 セッションにそもそも入らない

無名関数を格納しているインスタンスを Session に入れることができない。

原因

そのままである。無名関数を含むインスタンスはセッションに突っ込めない。

クロージャは定義時点のスコープを切り取る働きがあるのでPHPの世界から引き剥がして Session に入れてしまうと、 元に戻したとしてもどのスコープになるかわからないからだ。

解決

クロージャを使わない

Tag

php/fuelphp/become_no_session_special_case.txt · 最終更新: 2021-05-10 10:13 by ore