Zend_SessionでDBにデータを保存
Zend_SessionでDBにデータを保存した時に、セッション情報が復元されない問題が発生しました。
分かりにくいポイントなので備忘録として残しておきます。
原因としてはDBの文字コードが合っていないため、テーブルに保存するタイミングで文字化けを起こし、それを復元時にunserializeでエラーになっていたというものです。
セッションハンドラは暗黙的に呼び出しをされるのと、unserialize自体のエラーが表に出ないため解析に時間がかかりました。
文字コードの設定はマニュアルに記載がなかったのですが、ZendFrameworkのコードを見ることでわかりました。
Db/Adapter/Pdo/Mysql.phpの_connectを参照
参考にコードを載せておきます。
$db = Zend_Db::factory('Pdo_Mysql', array( 'host' => $config->host, 'username' => $config->user, 'password'=> $config->pass, 'dbname' => $config->name, 'charset' => 'ujis' )); Zend_Db_Table_Abstract::setDefaultAdapter($db); $config = array( 'name' => 'session', 'primary' => 'id', 'modifiedColumn' => 'modified', 'dataColumn' => 'data', 'lifetimeColumn' => 'lifetime' ); Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));