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/