ロックオン開発チームブログ -Lockon Knowledge Repositories-

EC-CUBEのDB接続をmdb2に変更

ITproの記事にもありましたが、PHPでDB接続にPEAR::DBを使っている場合にはPEAR::MDB2への移行を推奨するとのことです。

http://itpro.nikkeibp.co.jp/article/COLUMN/20070827/280396/

 

現在、EC-CUBEではDB接続にPEAR::DBを用いていますので、移行できるか試して見ました。

まず、MDB2のパッケージをダウンロードし、解凍したものを data/module 配下に置きます。

今回はPostgreSQLで以降の検証を行いたいと思います。

http://pear.php.net/package/MDB2/download/2.4.0 http://pear.php.net/package/MDB2_Driver_pgsql/download

 

次にMDB2を用いてDB接続を行うようにプログラムを改造します。

 

変更ファイル:data/class/SC_DbConn.php

class SC_DbConn{    
    var $conn;
    var $conn_mdb2; // MDB2の接続オブジェクト    
    var $result; 
    var $includePath;
    var $error_mail_to;
    var $error_mail_title;        
    var $dsn;        
    var $err_disp = true;

    // コンストラクタ        
    function SC_DbConn($dsn = "", $err_disp = true, $new = false){        
        global $objDbConn;    
        global $objDbConnMDB2;
        // Debugモード指定    
        $options['debug'] = PEAR_DB_DEBUG;    
        // 既に接続されていないか、新規接続要望の場合は接続する。    
        if(!isset($objDbConn->connection) || $new) {    
            if($dsn != "") {
                $objDbConn = DB::connect($dsn, $options);    
                $objDbConnMDB2 = MDB2::factory($dsn, $options);  // MDB2で接続を行う    
                $objDbConnMDB2->loadModule('Extended', null, false);  // getAllなどのPEAR::DBで使用していた関数をそのまま使えるようにするためのモジュール                    
                $this->dsn = $dsn;    
            } else {        
                if(defined('DEFAULT_DSN')) {    
                    $objDbConn = DB::connect(DEFAULT_DSN, $options);
                    $objDbConnMDB2 = MDB2::factory(DEFAULT_DSN, $options);  // MDB2で接続を行う
                    $objDbConnMDB2->loadModule('Extended', null, false); // getAllなどのPEAR::DBで使用していた関数をそのまま使えるようにするためのモジュール                    
                    $this->dsn = DEFAULT_DSN;
                } else {    
                    return;
                }    
            }        
        }            

        $this->conn = $objDbConn;
        $this->conn_mdb2 = $objDbConnMDB2; // MDB2で接続を行ったオブジェクト
        $this->error_mail_to = DB_ERROR_MAIL_TO;
        $this->error_mail_title = DB_ERROR_MAIL_SUBJECT;
        $this->err_disp = $err_disp;
    }    

*** 中略 ***

    // SELECT文の実行結果を全て取得    
    function getAll($n, $arr = ""){    
        // mysqlの場合にはビュー表を変換する
        if (DB_TYPE == "mysql") $n = sfChangeMySQL($n);

        if(PEAR::isError($this->conn)) {        
            sfErrorHeader("DBへの接続に失敗しました。");            
            gfPrintLog("couldn't connect : " . $this->dsn);            
            return 0;            
        }            

        if ( $arr ){    
            //$result = $this->conn->getAll($n, $arr, DB_FETCHMODE_ASSOC);
            $result = $this->conn_mdb2->extended->getAll($n, null, $arr, null,DB_FETCHMODE_ASSOC, false);  // MDB2で実行            
        } else {    
            //$result = $this->conn->getAll($n, DB_FETCHMODE_ASSOC);
            $result = $this->conn_mdb2->extended->getAll($n, null, null, null,DB_FETCHMODE_ASSOC, false);  // MDB2で実行            
        }    
        if ($this->conn->isError($result)){    
            $this->send_err_mail ($result, $n);
        }    
        $this->result = $result;

        return $this->result;
    }

 

他に、MDB2モジュールのパスを正しく設定してあげれば終了です。

 

今回は検証ということで、getAllのみをMDB2で取得するようにしております。

そのため、無駄に2回DB接続を行ったりしていますので、正式に移行する場合にはPEAR::DBは削除するようにしてください。

また、まだデータ更新部分は検証していなかったり、色々やることはあるのですが、 移行自体は思ったより簡単に行うことが出来そうです。

(なんとなくですみません。。。)

 

今回は移行できるかの検証をさせていただきまが、MDB2の方が速いといったメリットもあるようですので、次回くらいには速度面からも検証していければと思います。

Trackback

このエントリーのトラックバックURL:
http://www.lockon.co.jp/cgi-bin/mt/mt-tb.cgi/311

コメント



Copyright(c) LOCKON CO.,LTD. All Rights Reserved.