CodeIgniterでPHPの通常のセッションを利用する

CodeIgniterの場合、独自のクッキーを使ったセッションクラスを利用しています。
携帯端末を使う場合、このままではだめで、日本CodeIgniterユーザ会などがTIPSで書いているようにDBを使うなどしないといけません。

通常のPHPのセッションをラップしたクラスを書いてみました。

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

/**
 * LICENSE
 *
 * This source file is subject to the new BSD license that is bundled
 * with this package in the file LICENSE.txt.
 *
 * @category
 * @package    Session Class
 * @author     KUNIHARU Tsujioka <kunitsuji@gmail.com>
 * @copyright  Copyright (c) 2008 KUNIHARU Tsujioka <kunitsuji@gmail.com>
 * @copyright  Copyright (c) 2006-2008 Usagi Project (URL:http://usagi.mynets.jp)
 * @license    New BSD License
 */

class Session {

    // the ONE TIME Ticket NAME
    private $_ticket = 'OneTimeTicket';

    // constructor
    function __construct()
    {
    }

    /**
     * 値を返却
     *
     * @param   string  key名
     * @param   string  namespace default='default'
     * @return  string  値
     * @access  public
     */
    public function get($key = null, $namespace = 'MyNETS')
    {
        if(isset($key))
        {
            return isset($_SESSION[$namespace][$key]) ? $_SESSION[$namespace][$key] : null;
        }
        else
        {
            return isset($_SESSION[$namespace]) ? $_SESSION[$namespace] : null;
        }
    }

    /**
     * 値をセット
     *
     * @param   string  key名
     * @param   string  値
     * @param   string  namespace default='default'
     * @access  public
     */
    public function set($key, $value, $namespace = 'MyNETS')
    {
        if (!$key)
        {
            $_SESSION[$namespace] = $value;
        }
        else
        {
            $_SESSION[$namespace][$key] = $value;
        }
    }

    /**
     * Keyの値を削除する
     * パラメータを渡さない場合は、現在のセッション情報をすべてクリアする
     *
     * @param   string  key名
     * @param   string  namespace default='default'
     * @access  public
     */
    public function remove($key = null, $namespace = 'MyNETS')
    {
        if(isset($key) && ($key !== null))
        {
            unset($_SESSION[$namespace][$key]);
        }
        else
        {
            unset($_SESSION[$namespace]);
        }
    }

    /**
     * セッション開始
     *
     * @access  public
     */
    public function start()
    {
        $CI   =& get_instance();
        $path = $CI->config->item('session');
        if ($this->setPath() != $path['save_path'])
        {
            $this->setPath($path['save_path']);
        }
        @session_start();
    }

    /**
     * セッション終了
     *
     * @access  public
     */
    public function close()
    {
        $_SESSION = array();
        session_destroy();
    }

    /**
     * セッション名を返却
     *
     * @return  string  セッション名
     * @access  public
     */
    public function getName()
    {
        return session_name();
    }

    /**
     * セッションIDをセット
     *
     * @param   string  セッションID
     * @access  public
     */
    public function setID($id = '')
    {
        if ($id) {
            session_id($id);
        }
    }

    /**
     * セッションIDを返す
     *
     * @return  string  セッションID
     * @access  public
     */
    public function getID()
    {
        return session_id();
    }

    /**
     * save_pathをセット
     *
     * @param   string  path
     * @access  public
     */
    public function setPath($path = NULL)
    {
        if(isset($path))
        {
            session_save_path($path);
        }
        else if ($path == null)
        {
            return session_save_path();
        }
        else
        {
            return ;
        }
    }

    /**
     * use_cookies をセット
     *
     * @param   bool  use_cookies default true
     * @access  public
     */
    public function setUseCookies($useCookies = TRUE)
    {
        if ($useCookies)
        {
            ini_set('session.use_cookies', 1);
        }
        else
        {
            ini_set('session.use_cookies', 0);
        }
    }

    /**
     * session.gc_maxlifetime をセット
     *
     * @param   int     maxlifetime default 432000(5days) 秒で指定
     * @access  public
     */
    public function setSessionMaxLifetime($time = 432000)
    {
        ini_set('session.gc_maxlifetime', $time);
    }

    /**
     * COOKIEをセット
     *
     * @param   string  name
     * @param   string  value
     * @param   string  namespace
     * @access  public
     */
    public function setCookie($name, $value, $namespace = 'MyNETS')
    {
        ini_set('session.gc_maxlifetime', $time);
    }

    /**
     * ONE TIME Ticketの名前を返す
     *
     * @return  string  One Time Ticketの名前
     * @access  public
     */
    public function getTicketName()
    {
        return $this->_ticket;
    }

    /**
     * ONE TIME Ticketの名前を設定
     *
     * @param   string  One Time Ticketの名前
     * @access  public
     */
    public function setTicketName($ticket)
    {
        $this->_ticket = $ticket;
    }

    /**
     * ONE TIME Ticketの値を返却
     *
     * @return  string  One Time Ticketの値を返却
     * @access  public
     */
    public function getTicket()
    {
        return $this->get($this->getTicketName());
    }

    /**
     * ONE TIME Ticketの値を生成
     *
     * @access  public
     */
    public function buildTicket()
    {
        $this->set($this->getTicketName(), md5(uniqid(rand(),1)));
    }

    /**
     * ONE TIME Ticketの値を比較
     *
     * @param   string  One Time Ticketの値
     * @return  bool    TRUE or FALSE
     * @access  public
     */
    public function checkTicket($value)
    {
        if ($this->getTicket() !== $value)
        {
            return FALSE;
        }
        else
        {
            return TRUE;
        }
    }

    /**
     * ONE TIME Ticketの初期化
     *
     * @access  public
     */
    public function initTicket()
    {
        $this->remove($this->getTicketName());
    }

}
?>

使い方としては
application/libraries/に
Session.phpとして保存。
$this->load->library('session');
で呼び出し、
$this->session->start()で開始。
※config/に、セッションに関する設定情報を保存する必要があります。
$CI =& get_instance();
$path = $CI->config->item('session');
if ($this->setPath() != $path['save_path'])
{
$this->setPath($path['save_path']);
}
@session_start();

$config['save_path']
が設定されてないとエラーになるかも。
一応
config/session.php
を置いて、
$config['save_path'] = '/tmp';
なりでセッションを保存するサーバーのパスを用意しておいたほうがいいとおもいます。
自分の場合は
アプリケーションで切り分けできるように別の場所を指定していますが。
また、ここを指定していない場合はデフォルトを利用するように変更するのもありでしょうね。

これで、クッキーを使わないセッションをクラスでまとめるようにしてます。
ワンタイムチケットなんかもここに入れてみました。