HTTP_Session2 0.7.2 (beta)
http://pear.php.net/package/HTTP_Session2
MDB2 2.5.0b2 (beta)
http://pear.php.net/package/MDB2
MDB2_Driver_mysqli 1.5.0b2 (beta)
http://pear.php.net/package/MDB2_Driver_mysqli
PHPのセッションはデフォルトではファイルで管理されています。
/tmpやC:\tmp等に、
sess_b84f39d3a34984b515ea715226f1b6fc
といったファイル名で保存されています。
中は単なるテキストファイルで、覗いてみると、$_SESSION['data']='hogehoge';等と書いた内容がそのまま記録されているのがわかります。
その後Cookieにb84f39d3a34984b515ea715226f1b6fcと入れて行くと、該当のファイルが読み込まれてセッションを継続することができます。
で、例えば2台のサーバでロードバランシングを行っている場合等、セッションをローカルに保存していると問題が起こります。
一回目のリクエストが片方のサーバに行き、次のリクエストがもう一方のサーバに行ってしまうと、当然そっちのサーバにはセッションファイルが無いので読み込まれません。
セッションが途切れてしまうわけです。
というわけでこのような問題の回避方法として、セッションの保存方法を書き換えることができます。
Pear::HTTP_Session2を使用してセッションをデータベースに保存してみましょう。
方針としては、2台のサーバでHTTPリクエストを処理しつつ、データベースは同じ一台を見るのでセッション自体は継続する、ということになります。
まあ今回はローカルなのでサーバも一台ですが。
HTTP_Session2はバックエンドとしてPear::DB、MDB2、Memcacheに対応していますが、Memcacheは意味がないのでMDB2を使用します。
入っていない場合は適当にpear installしましょう。
まず以下のSQLを実行し、データベースを作成しておきます。
CREATE DATABASE `session`; CREATE DATABASE CREATE TABLE sessiondata ( id varchar(32) NOT NULL, expiry int(10), data text, PRIMARY KEY (id) ); |
そうしたらHTTP_Session2を実行。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
//require
require_once 'HTTP/Session2.php';
//URL、cookieでのセッションを禁止
HTTP_Session2::useTransSID(false);
HTTP_Session2::useCookies(false);
//MDB2を使用
HTTP_Session2::setContainer(
'MDB2'
,array('dsn' => 'mysql://testuser:testpass@localhost/session'
,'table' => 'sessiondata')
);
//その他設定
HTTP_Session2::start('s');
HTTP_Session2::setExpire(time() + 60); //有効期限
HTTP_Session2::setIdle(time() + 5); //アイドル時間
//期限切れなら破棄
if (HTTP_Session2::isExpired()) {
HTTP_Session2::destroy();
}
if (HTTP_Session2::isIdle()) {
HTTP_Session2::destroy();
}
//アイドル時間更新
HTTP_Session2::updateIdle();
//普通にセッションが使える
$_SESSION['sample']='あいうえお';
|
以後は普通に$_SESSION['a']='b';とか書くと、それがセッションファイルではなくDSNで指定したDBに記入されます。
セッションの挙動を書き換えることに成功しました。
簡単ですね。
万一文字化けしたらCREATE TABLEやset namesなんかで適当にどうにかしてください。