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の方が速いといったメリットもあるようですので、次回くらいには速度面からも検証していければと思います。

