複数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
