裏紙に書く程度の内容

codeigniter sessionをDBで使う

CodeigniterのセッションでDBを使う方法のメモ書き。

セッション用テーブルを作成する

セッション用のテーブルを作成します。 ここはCodeigniterのマイグレーションツールを使うことにします。

マイグレーションファイルを準備する

“application/migrations/“ディレクトリを作成し、”201620260000_create_session_table.php”ファイルを下記内容で作成します。

ファイル名先頭の12桁は日時にしています。これはバージョン管理に使われるので、実行する日時にするのがわかりやすいでしょう。

    $dbforge->add_field(array(
                'id' => array(
                    'type'          => 'varchar',
                    'constraint'    => 40,
                    'null'          => false,
                ),
                'ip_address' => array(
                    'type'          => 'varchar',
                    'constraint'    => 45,
                    'null'          => false,
                ),
                'timestamp' => array(
                    'type'          => 'int',
                    'constraint'    => 10,
                    'unsigned'      => TRUE,
                    'default'       => 0,
                ),
                'data' => array(
                    'type'          => 'blob',
                    'null'          => false,
                ),
            ));
            $this->dbforge->add_key('id', true);
            $this->dbforge->create_table('ci_sessions');

            // インデックス追加
            $this->db->query('alter table ci_sessions add index ci_sessions_timestamp (timestamp)');

        }
        public function down()
        {
            $this->dbforge->drop_table('ci_sessions');
        }
    }

マイグレーションコントローラを準備

続いてマイグレーションを実行するコントローラを準備します。

“application/controllers/Migrate.php”を下記の通り作成します。

ここではコマンドラインからのみ実行するように設定しています。

    input->is_cli_request()) {
                show_error();
            }
            $this->load->library('Migration');

        }

        public function index()
        {
            if ($this->migration->current() {
                show_error($this->migration->error_string());
            }
        }

        public function current()
        {
            $this->migration->current();
        }

        public function latest()
        {
            $this->migration->latest();
        }

        public function rollback($version)
        {
            $this->migration->version($version);
        }
    }

メインとは別のDBを使う場合

上記コンストラクタ内$this->load->library('Migration')でMigrationをロードしています。この時点で、バージョン管理用のテーブルデフォルトでは”migrations”がターゲットのDBに作成されてしまいます。

デフォルト以外のDBに対してマイグレーション処理を行いたい場合は下記のように”Migration”ライブラリロード前に”dbforge”をロードします。

    $db = $this->load->database('test');
    $this->load->dbforge($db);
    $this->load->library('Migration');

※’test’は”application/config/database.php”で設定しているデータベースグループ名です。

設定値を編集

“application/config/migration.php”の、’migration_enabled’をtrueにしておきます。

    $config['migration_enabled'] = TRUE;

これを忘れてると、”Migrations has been loaded but is disabled or set up incorrectly.”ってエラーになります。

テーブルを作成

準備したマイグレーションを実行してテーブルを作成します。 今回はコマンドでのみ実行出来るようにしたため、下記コマンドを実行します。

    php index.php Migrate latest

終了したらテーブルが出来ていることを確認してください。

間違ってた!戻したい!

元に戻す場合は以下のコマンド。

    php index.php Migrate rollback (バージョン)

(バージョン)部分はファイル名先頭にある日時です。全てのマイグレーションがなかったことにするにはこれを0にして実行します。

マイグレーション使わない場合

必要なテーブルは

    CREATE TABLE IF NOT EXISTS `ci_sessions` (
            `id` varchar(40) NOT NULL,
            `ip_address` varchar(45) NOT NULL,
            `timestamp` int(10) unsigned DEFAULT 0 NOT NULL,
            `data` blob NOT NULL,
            KEY `ci_sessions_timestamp` (`timestamp`)
    );

です。マイグレーション使わない場合はこのSQLでもOK

設定ファイルの編集

テーブルが出来たら設定ファイルを設定します。

“application/config/config.php”

    $config['sess_driver'] = 'database';
    $config['sess_cookie_name'] = 'ci_session';
    $config['sess_expiration'] = 7200;
    $config['sess_save_path'] = 'ci_sessions';
    $config['sess_match_ip'] = FALSE;
    $config['sess_time_to_update'] = 300;
    $config['sess_regenerate_destroy'] = FALSE;

設定値は以下の通りです。

設定名 デフォルト値 説明
sess_driver files セッションドライバ名。DBを使う場合は’database’
sess_cookie_name ci_session クッキー名
sess_expiration 7200 セッションの有効期限(秒)
sess_save_path null セッションの保存先。DBを使うセッションの場合はセッションテーブル名
sess_match_ip FALSE IPアドレスの検証有無
sess_time_to_update 300 セッション再作成の時間(秒)
sess_regenerate_destroy FALSE セッションIDを破棄するかどうか。FALSEの場合でも、後でGCによって破棄される

最低限変更が必要なのは’session_driver’,’sess_save_path’のみです。

使ってみる

準備ができたので使ってみましょう。

コントローラで下記のようにします。

    $this->load->library('session');
    $this->session->set_userdata('sess_key', 'データ');

※”sess_key”部分はアクセス時に指定する任意のキー名称。

これが実行されると、作成したセッションテーブルにデータが出来ていると思います。

セッションのデータを取得する場合は以下。

    $this->session->userdata('sess_key');

loadがめんどくさい場合

sessionを使うたびに毎回 $this->load->library('session'); しなきゃいけないのが面倒な場合は”autoload”に設定します。

“application/config/autoload.php”

の’libraries’に’session’を追加すればOKです。

    $autoload['libraries'] = array('session');

まとめ

セッションの使い方といいながらほとんどマイグレーションツールの使い方になってしましました。

使ったことない人は試してみると便利さ実感できるかも!

参考

http://qiita.com/pugiemonn/items/8a6b322654aa65e2966b http://pneskin2.nekoget.com/codeigniter/3/user_guide/

URABLO
広告
Index
広告