SymfonyのセッションデータをMySQLに格納する

さくらインターネットから、「ファイル数多すぎるんで削除してください」という連絡が来たのでなんのこっちゃと調べたら、
この間の設定変更で指定したセッションファイル格納用ディレクトリが溢れているという話らしい。おおっと。
でもって、話をよくよく聞いてみるとセッションが使用不可になったのも共用ディレクトリである「/tmp」に保存できるファイル数が10万ファイルまでに制限されているからだそうな。当たり前か。

本当のことを言うと、そう大したユーザー数がいるとも思えないサービスなのに溢れすぎじゃないかと思うけど、
設定を見返すのは後回しにしてとりあえず現状を改善しないと行けない。
よくよく考えてみて、「/tmp」ディレクトリのパーミッション的に階層化も出来そうにないし、
こりゃセッションデータをMySQLに格納するしかないかなと言うことで以下の設定を。

参考:

symfonyでセッションにデータベースを使用する [dozo dokuwiki.php]
Practical symfony | 22日目: デプロイ | symfony | Web PHP Framework




セッション情報格納用のテーブルを作成する

適当なDB上にて以下のクエリを発行する。

CREATE TABLE `session_storage` (
`session_id` varchar(255) NOT NULL,
`session_data` longtext NOT NULL,
`session_time` bigint(20) NOT NULL,
PRIMARY KEY  (`session_id`)
) ENGINE=MyISAM;
「session_id」などのフィールド名は後で指定も出来るので、特にこれでなくても良い。わかりやすい方が良いけど。



Symfonyの設定

とりあえず、Doctrineの場合。

database.yml

all:
doctrine:
class: sfDoctrineDatabase
param:
dsn: 'mysql:host=hoge.com;dbname=database'
username: user
password: password

factories.yml

  storage:
class: sfPDOSessionStorage
param:
database:     doctrine
session_name: symfony
db_table:     session_storage
db_id_col:    session_id
db_data_col:  session_data
db_time_col:  session_time
これだけ。セッションを利用しているプログラム側は特にいじるところはなくて、設定の変更だけで行ける。



セッションファイルの削除

既に生成されてしまったセッションファイルは以下のコマンドで削除した。

echo /tmp/sess_* | xargs rm
自分が生成したのではないものはどうせ削除の許可がなくてエラーになるのでこれでOK。だと思う。