PHPセッションをDBで管理 - OracleでのAutoIncrement用テーブルを作成編
PHPのセッション管理はデフォルトがファイルでの管理になりますが、WEBサーバーを冗長化した時などは各サーバーにセッション用ファイルが格納されてしまうため、途中でセッションが切れてしまうといった問題が発生します。
そうならないために、PHPのセッションをDBで管理する方法をやってみます。
セッション管理するDBとして、今回はOracleを使用しています。
ちょっと書くことが多いので、エントリを2つに分けて書きます。
今回はセッション情報を格納するOracleでのAutoIncrement用テーブルを作成する方法について書きます。
※参考にさせてもらったページ
PHPのセッションをDB管理するにあたり、全体的な部分は「Web Artisan Blog」、OracleでAutoIncrementについては「イイ!! プログラミング Blog」、OracleのCLOBの更新方法等については「あるプログラマーのつぶやき」を参考にさせていただきました。
テーブルの作成
オートインクリメントする項目についてはNUMBER型+NOT NULL+PRIMARY KEYとします。(下記では"seq_no")
セッションIDをセットする項目にはCHAR型+UNIQUEとします。(下記では"sessid")
実際にセッションの値が格納される項目はCLOB型にします。
ガベージコレクションを実施するために最終更新日時の項目をDATE型で定義します。(下記では"updated_at")
CREATE TABLE sessions ( seq_no NUMBER NOT NULL, sess_id CHAR(32) NOT NULL , data CLOB, update_time DATE, CONSTRAINT pk_sessions PRIMARY KEY( seq_no ), CONSTRAINT uq_sessions UNIQUE( sess_id ) )
シーケンスの作成
次にインクリメントされるためのシーケンスを作成します。
1から始まり1ずつ増える、ごく一般的なシーケンスです。
最大値として「NOMAXVALUE」を指定しておきます。
CREATE SEQUENCE sessions_seq START WITH 1 INCREMENT BY 1 NOMAXVALUE;
トリガーの作成
先に作成した、テーブルとシーケンスを結びつけるためのトリガーを作成します。
sessionsテーブルへのINSERTが発生した場合に、sessions_seqから新たに取得したシーケンスを「:new.seq_no」に代入してからレコードがINSERTされるようにします。
CREATE TRIGGER sessions_trigger BEFORE INSERT ON sessions FOR EACH ROW BEGIN SELECT sessions_seq.nextval INTO :new.seq_no FROM dual; END;
これでOracleでのAutoIncrement用テーブルが作成出来ました。
実際に使ってみる。
実際にsessionsテーブルにレコードをINSERTとしてみます。
以下のINSERTのSQLを実行してみます。
SQL> INSERT INTO sessions (sess_id, data, update_time) VALUES ('session_id_001', 'hogehoge', sysdate); SQL> INSERT INTO sessions (sess_id, data, update_time) VALUES ('session_id_002', 'foobar', sysdate); SQL> commit;
で、実際にテーブルのデータを確認してみると、
sessionsテーブルのデータ
seq_no | sess_id | data | update_time |
---|---|---|---|
1 | session_id_001 | hogehoge | 2010/07/30 10:00:00 |
2 | session_id_002 | foobar | 2010/07/30 10:05:12 |
という感じで、seq_noが自動でインクリメントされた形でレコードが追加されました。
これで、セッション用テーブルの作成は出来ました。
続いては、PHP側でセッション管理用のコールバック関数を作成する必要がありますが、
それは別エントリで書きます。