FuelPHP SessionでMemcacheを使う時の注意

Session Driverをmemcachedにしてlocalhost以外のサーバーに向けたい時は
Sessionクラス拡張しないといけないよ。

ってメモです。

■ core/configからsession.phpをapp/configにコピー

cp ../../core/config/session.php .  

■ driverをmemcachedに変更する

$ diff session.php ../../core/config/session.php
33c33
<       'driver'                        => 'memcached',
---
>       'driver'                        => 'cookie',

■ なぜか読み込まれたconfigをdumpしてみるとmemcachedのserversに2個設定がある

  array(2) {
    ["cookie_name"]=>
    string(7) "fuelmid"
    ["servers"]=>
    array(2) {
      [0]=>
      array(3) {
        ["host"]=>
        string(9) "127.0.0.1"
        ["port"]=>
        int(11211)
        ["weight"]=>
        int(100)
      }
      [1]=>
      array(3) {
        ["host"]=>
        string(9) "127.0.0.1"
        ["port"]=>
        int(11211)
        ["weight"]=>
        int(100)
      }
    }
  }

■ core/config/session.phpに書いてあるのserversの情報がマージされてしまうみたい

array('host' => '127.0.0.1', 'port' => 11211, 'weight' => 100)

■ session保存先を外のmemcacheサーバーに向けたい時にどうしよう

■ config.phpは拡張できない。
コア拡張の例外
ここにある通りconfigは拡張できません。
試しに拡張してみると上手く設定が読み込まれませんでした。(自分のやり方が変だった?)

■ 解決案1 本家でcore/config/session.phpのserversの設定を消してもらう。
session.phpのserversで127.0.0.1の設定無ければcore/classes/session/memcached.php内で
勝手に同じ情報がデフォルト値として設定されるので要らない。
自身でcoreの中を書き換えてしまうとバージョンアップ時にトラブルの元になるので避けたい。

■ 解決案2 core/classes/session.php拡張して_initメソッドだけ書き換える。

Config::loadの第4引数をtrueにすることで設定がOverwriteされるようになりcoreの設定が引き継がれなくなる。

session.phpを拡張
fuel/app/classes/session.php

<?php
class Session extends FuelCoreSession
{
    public static function _init()
    {
        //Config::load('session', true);
        Config::load('session', true, false, true);

        if (Config::get('session.auto_initialize', true))
        {
            static::instance();
        }
    }
}

Autoloaderに追加
fuel/app/bootstrap.php

Autoloader::add_classes(array(
    // Add classes you want to override here
    // Example: 'View' => APPPATH.'classes/view.php',
    'Session' => APPPATH.'classes/session.php',
));

解決案2がいいかなーと思います。