CodeIgniterの学習 38 - DB2_SessionとさよならしてCodeIgniter Version 1.7.0のSession.phpに移行しつつ、FreakAuth等既存のdb_sessionと書いているソースを置換しないで済ませる方法まとめ
(08/11/10 5:10全削除)
なんか$config['sess_time_to_update']がらみでうまくいかない+あまりいろいろ書くと逆に混乱するので、
このエントリ(CodeIgniterの学習 38)は残さずにあえて削除します。顔洗って深呼吸して出直してくるねん。
(08/11/10 5:50復活)
うむ、たぶんこれで動くので再度載せておく。載せておくけど、素直に一括置換した方が混乱しないと思う。(当然バックアップを取って戻せるようにした後にやる。)
あと、$autoload['libraries']で、'session'を読み込まない場合には、
$this->load->library('session');を使うこと。($this->load->library('db_session');だと動かない。
想定している対象者は、
- Version1.6.xで Db_sessionを使っていた人で、Version1.7.0のSession.phpに移行したい人。かつ既存のソースに極力手を入れたくない人。
- 過去のwiki等のサンプルプログラム内の $this->db_sessionを、sed等で$this->sessionに置換せずに使い続けたい人。
- 一括置換が怖い人
です。そんな人はあんまりいないかもしれないけど。
実験環境
全部1.7.0にあげるのはまだ怖いので、取りあえず system/libraries/Session.phpのみVersion.1.7.0にアップする。当然バックアップは取っておく。
注意1
Db_sessionを使用している時の、$_COOKIE['ci_session'] の中身は、4611dc034cead0804f8ce0cc077310e6
みたいにセッションIDのみが保持されていたが、
Session.phpを使用すると、$_COOKIE['ci_session'] の中身は、
A)$config['sess_encrypt_cookie'] = FALSE;の時:
a:4:{s:10:"session_id";s:32:"4611dc034cead0804f8ce0cc077310e6";s:10:"ip_address";s:13:"192.xx.yy.zz";s:10:"user_agent";s:50:"Mozilla/5.0 (Windows; U; Windows NT 6.0; ja; rv:1.";s:13:"last_activity";s:10:"1226248977";}7b54fff6fde78c6c3cf72c732edfc863
B)$config['sess_encrypt_cookie'] = TRUE;の時:、
UDFdPw04UWsHKQUmUDkMagU0Az4C1AsWD1SKVIvWzxWN1VoBFhVsO1w4XyVdZ1MgXjEBYlMyUTxQc1c0CmtQbFw5B24PMFo2UW8HYFdhCDpQaV1kDWhRYQczBWZQNwxuBWYDZQI5UDxYOVI4UmVbMVZvVTYENFVlXG5fJV1nUyBeMQFgUzBRPFBzVzkKeVAAXD0Haw9lWiZROgcnVycILVBrXXYNNlFgB2EFb1AhDGoFPQM2Ai9QblhuUmJScltnVmxVKAQ2VWZcfl88XS9TaV46AWFTOlEkUCRXIwpsUC1cAwduD2ZaMVExByBXdgg0UCNdPw05UWEHaAV3UE4MNAV+A20CbVAzWDlSdVJpW3tWaFUmBC9VBVw1X2ldOFM8XnwBIlM7USZQBFdrCilQCFw1B2EPZVo7USgHJ1d0CEFQBF0lDTpRfwdiBW5QIwwxBWUDPwIhUC1YLlJgUm1be1Z6VT0EdFVoXG1fNF1mU3FeZwEwU3NRclAOVzEKalArXDUHeQ9oWiBRJgd2V28IZlBqXTQNPlFjB2QFZ1A3DGwFMwM0AjdQZFgl
みたいになるので、注意。(TRUEにすると重いんだよなー。)
注意2
以前独自に解決した、更新期限内($config['sess_time_to_update']秒 以内)ならば、クッキー側のセッションIDは入れ替えない(SetCookieしない)ようにした。
の対応は、標準のSession.phpには入っていないので、もう一度なんとかして直す必要有り。
他にも挙動は微妙に違うはずなので、すぐにDb_session使用をやめるのも冒険かもね。俺は冒険が好きだから変えるけど。
作業手順
手順1:system/application/config/config.php の確認
特に変更無し、
こんな感じ
<?php //上略 $config['sess_cookie_name'] = 'ci_session';//クッキーの名前 $config['sess_expiration'] = 7200;//セッションの有効期限 $config['sess_encrypt_cookie'] = FALSE;//クッキーの暗号化 $config['sess_use_database'] = TRUE;//DBを使用するかどうか $config['sess_table_name'] = 'ci_sessions';//テーブル名 $config['sess_match_ip'] = TRUE;//ipアドレスまでチェックするかどうか $config['sess_match_useragent'] = TRUE;//UAまでチェックするかどうか $config['sess_time_to_update'] = 5;//セッションID強制切り替えの任意の秒数 //下略 ?>
切り替え秒数は任意の長さ、デフォルトだと300秒のはず。
とりあえず短くしてみるが不具合があるようならば長めに戻す。
手順2:system/application/config/autoload.php の変更
<?php //上略 //$autoload['libraries'] = array('database','Db_session', 'Freakauth_light'); $autoload['libraries'] = array('database','session', 'Freakauth_light'); //下略 ?>
みたいにする。Db_sessionさんさようなら。これまでありがとう。
手順3:system/libraries/Session.php のファイル差し替え
CodeIgniter 1.6.3のSession.phpを、CodeIgniter1.7.0のSession.phpに差し替える。(上書きコピー)
手順4:application/libraries/MY_Session.php を新設
流儀に従って、Session.phpを継承し、MY_Session.phpを作る。以後の改造はこれをベースにすればいいね。
(親クラスのコンストラクタを呼んだ後に、有無を言わさず$this->CI->db_sessionに、$thisを突っ込んでいる。)
application/libraries/MY_Session.php
<?php if ( ! defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' ); class MY_Session extends CI_Session { function MY_Session( $params = array() ) { // セッションテーブルの列名変更 // alter table ci_sessions change session_data user_data mediumtext default '' not null ; // もやっておくこと parent :: CI_Session( $params ); $this->CI->load->library('db_session'); $this->CI->db_session =& $this; } } // END Session Class /* End of file MY_Session.php */ /* Location: ./application/libraries/MY_Session.php */ ?>
手順5:application/libraries/Db_session.php を差し替え
空のクラスだけ作っておく。ここには何も書かない。
<?php if ( ! defined( 'BASEPATH' ) ) exit( 'No direct script access allowed' ); class Db_session{ } /* End of file Db_session.php */ /* Location: ./application/libraries/Db_session.php */ ?>
手順6:ci_sessionsテーブルの、session_data列の列名をuser_data列にリネームする。
mysql上で
alter table ci_sessions change session_data user_data mediumtext default '' not null ;
等で列名を変更。(ついでにtext型をmediumtext型にしている。)
以上。後は、MY_Session.phpを好きにいじくり倒しましょう。
以後のエントリは全部 $this->session-> で行きます。(これまでのエントリの$this->db_sessionは直さないでそのままにしておく。)