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は直さないでそのままにしておく。)