- 2006-09-27
- php
Sharedance をちょっといじってみた(正確にはまだソースしか見てないけど)。
複数の Web サーバ間で PHP のセッション共有ができるものとして知られているみたいだけど、 実際にはとにかくキーと値のペアを TCP/IP 経由で fetch/store できるようにするというもの。
だからちょっとしたデータベースがわりにも使える。PHP 単体でもデフォルトのセッションハンドラに PHP からアクセスできれば便利なのになとちょっと思ったけど、まあ GDBM とか使えばいいんだけどさ。
あと libevent は便利そうだ。
しかし、たったこれだけの為にサーバーを作って独自のプロトコルを作るというのも何か悲しい感じがする。別に http でもいいんじゃないのかな。つまり、セッションを集中管理するためだけの apache を 1 つ用意しておく。
なんてことは世界で 2000 万人くらいの人が考えているかもしれない。なんか最近の PHP 事情をよくしらないからちょっと恥しいが思いついたので書いておこう。セッション管理する側はこんな感じ。
<?php
/* ppss.php */
if (empty($_GET["m"]) || empty($_GET["key"])) {
exit;
}
session_id("ppss" . $_GET["key"]);
session_start();
if ($_GET["m"] == "f") {
echo $_SESSION["data"];
}
else if ($_GET["m"] == "s") {
$_SESSION["data"] = $_GET["data"];
}
?>
fetch と store だけで delete が無いのは手抜きです。もういっそ、fetch.php とか store.php ってファイルを分けちゃった方がいいかもしれない。 セッション ID にプレフィックスを付ける必要は本当は無いんだけど、1 台のマシンで試験しようとすると flock して悲しいことになるので付けてある。
セッションハンドラと使う側はこんな感じ。
<?php
$PPSS_URL = "http://xxxxxxxxx/ppss.php?";
/* for PHP4
function http_build_query($params) {
$p = array();
foreach ($params as $key => $val) {
$p[] = urlencode($key) . "=" . urlencode($val);
}
return implode($p, "&");
}
*/
function session_handler_open($save_path, $session_name) { return TRUE; }
function session_handler_close() { return TRUE; }
function session_handler_delete($key) { return TRUE; }
function session_handler_gc($timeout) { return TRUE; }
function session_handler_store($key, $data) {
global $PPSS_URL;
$url = $PPSS_URL . http_build_query(array(
"m" => "s",
"key" => $key,
"data" => $data));
file_get_contents($url);
return TRUE;
}
function session_handler_fetch($key) {
global $PPSS_URL;
$url = $PPSS_URL . http_build_query(array(
"m" => "f",
"key" => $key));
$data = file_get_contents($url);
return $data;
}
session_set_save_handler('session_handler_open', 'session_handler_close',
'session_handler_fetch', 'session_handler_store',
'session_handler_delete', 'session_handler_gc');
session_start();
if (!isset($_SESSION["count"])) {
$_SESSION["count"] = 0;
} else {
$_SESSION["count"]++;
}
echo "count = " . $_SESSION["count"];
?>
パフォーマンスとかはあまり考えていない富豪的アプローチだけど、まあメリットとしては手軽さと、apache + PHP だけで動いているというプラットフォームに対する信頼性か。パフォーマンスが欲しければ apache モジュールにしちゃうのもそう難しくないだろう。