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));