hogehoge foobar Blog Style Beta

Web,Mac,Linux,JavaScript,Perl,PHP,RegExp,Git,Vim,Redmineなど技術的なことのメモや、ちょっと便利そうなものの紹介をしています。

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側でセッション管理用のコールバック関数を作成する必要がありますが、
それは別エントリで書きます。