おれおれDBIをPHPで作っててダメで反省した
<?php // DB操作用インターフェース class DBI { var $dbh; var $sth; /* * 接続開始 * */ function init($db_driver, $db_host, $db_name, $db_user, $db_pass) { include_once('DB.php'); $this->dbh = DB::connect("$db_driver://$db_user:$db_pass@$db_host/$db_name"); if (DB::isError($this->dbh)) { exit($this->dbh->getMessage()); } } /* * 接続解除 * */ function close() { $this->dbh->disconnect(); } /* * select * */ function do_select($sql, $arr = array(), $key = null) { $this->sth = $this->dbh->prepare($sql); $result = $this->dbh->execute($this->sth, $arr); if ( DB::isError($result) ) { die('呼び出し文の実行に失敗しました: ' . $result->getMessage()); } return $result ? $key ? $this->parse_hash($key, $result) : $this->parse_array($result) : false; } /* * update, delete, replace? * */ function do_regist($sql, $arr = array()) { $this->sth = $this->dbh->prepare($sql); $this->dbh->execute($this->sth, $arr) or die('追加クエリの送信に失敗しました'); } /* * 直実行 * */ function do_execute($sql) { $this->dbh->query($sql); if ( DB::isError($result) ) { die('直文の実行に失敗しました: ' . $result->getMessage()); } } /* * 結果を配列化 * */ function parse_array($db_data) { $array_list = array(); $cnt = 0; while ($data = $db_data->fetchRow(DB_FETCHMODE_ASSOC)) { $array_list[$cnt] = $data; $cnt++; } return $array_list; } /* * 結果を指定されたキーでハッシュ化 * */ function parse_hash($key = null, $db_data) { $array_list = array(); while ($data = $db_data->fetchRow(DB_FETCHMODE_ASSOC)) { $array_list[$data[$key]] = $data; } return $array_list; } } ?>
※これはゆうようせいのないコードです
全然インターフェイスって呼べる代物じゃないんだけど。
というかそもそも存在の意味が分からないんだけど!
これで5000件くらいレコードあるテーブルに
$DBI->do_select('SELECT * FROM hoge');
やったら死んだ。
parse_arrayのトコで死んでた。
やってみたら目測で1000件くらいが限界だったなー。
軽いデータ裁くには丁度いいけど、大きなデータ触るときには使えないなと思った。
因みにparse_arrayを使わず一個ずつ出力したら100万件やっても普通にまわせた。
phpのメモリ上のキャッシュオーバーも問題だったみたい。