複数Webサーバ、単一セッション管理でセッションかぶっちゃう問題ですが、調べたら5人日ぐらいかかりそう・・・とか思ってましたが、この間の勉強会で聞いたら、
「session_id()でセッションID設定できる。」
一瞬で解決しました。
解決策をまとめると、
「セッション維持してくれるロードバランサーを使う」 OR 「セッションIDにアドレスをくっ付ける」
となりました。
実装はこんな感じか!?
session_id(str_replace(".", "a", $_SERVER["SERVER_ADDR"]).session_id());
Mojavi2で使うためにIPでユニークなセッションIDを使うコンテナ、IpUniqueSessionContainerを作ってみました。
<?php
require_once (USER_DIR."SessionContainer.class.php");
class IpUniqueSessionContainer extends SessionContainer {
function load(& $authenticated, & $attributes, & $secure) {
if (ini_get("session.auto_start") != 1) session_start();
session_id(str_replace(".", "a", $_SERVER["SERVER_ADDR"]).session_id());
if (!isset($_SESSION["attributes"])) {
$authenticated = false;
$attributes = array();
$secure = array();
} else {
$authenticated = $_SESSION["authenticated"];
$attributes = $_SESSION["attributes"];
$secure = $_SESSION["secure"];
}
$_SESSION["authenticated"] =& $authenticated;
$_SESSION["attributes"] =& $attributes;
$_SESSION["secure"] =& $secure;
}
}
?>
IpUniqueSessionContainer-0.1.zip
index.phpのUSER CONTAINER SETTINGSのところでこんな感じで使う。
require_once(BASE_DIR."opt/user/IpUniqueSessionContainer.class.php");
$user =& $controller->getUser();
$user->setContainer(new IpUniqueSessionContainer());
ref: PHPのセッションID2