現在MySQLと連動したスクリプトを作成しているのですが、各プログラムにSQL、mysql_query()がありなんか負荷がかかりそうで直したいと考えています。
規模の大きいプログラム(phpbbなど)はどのようにしてSQLをまとめているのでしょうか?クラスなどを使用しているのでしょうか?
詳しくサンプルつきで説明お願いします。(最高130ポイント)
MySQL のような DB との連動は結局は SQL 文のやり取りになるので、
クラス化したところで CPU への負荷としては全く変わらないはずです。
ソースは読みやすくすっきりするかも知れませんが、きちんと
クラス化する為に生じる膨大な労力に見合うかどうかは疑問です。
例えば phpbb ではスクリプトの随所に逐一SQL文が書かれており、
何の抽象化も行っていません(下記参照)。私も大分昔に同じような
(もっと低機能ですが)BBS を MySQL+PHP で作りましたが、やはり
SQL文をゴリゴリ埋め込んで行く方法が一番シンプルで確実でした。
phpbb2 の index.php より抜粋:
switch(SQL_LAYER)
{
case 'postgresql':
$sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id
FROM " . FORUMS_TABLE . " f, " . POSTS_TABLE . " p, " . USERS_TABLE . " u
WHERE p.post_id = f.forum_last_post_id
AND u.user_id = p.poster_id
UNION (
SELECT f.*, NULL, NULL, NULL, NULL
FROM " . FORUMS_TABLE . " f
WHERE NOT EXISTS (
SELECT p.post_time
FROM " . POSTS_TABLE . " p
WHERE p.post_id = f.forum_last_post_id
)
)
ORDER BY cat_id, forum_order";
break;
case 'oracle':
$sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id
FROM " . FORUMS_TABLE . " f, " . POSTS_TABLE . " p, " . USERS_TABLE . " u
WHERE p.post_id = f.forum_last_post_id(+)
AND u.user_id = p.poster_id(+)
ORDER BY f.cat_id, f.forum_order";
break;
default:
$sql = "SELECT f.*, p.post_time, p.post_username, u.username, u.user_id
FROM (( " . FORUMS_TABLE . " f
LEFT JOIN " . POSTS_TABLE . " p ON p.post_id = f.forum_last_post_id )
LEFT JOIN " . USERS_TABLE . " u ON u.user_id = p.poster_id )
ORDER BY f.cat_id, f.forum_order";
break;
}
if ( !($result = $db->sql_query($sql)) )
{
message_die(GENERAL_ERROR, 'Could not query forums information', '', __LINE__, __FILE__, $sql);
}
>各プログラムにSQL、mysql_query()がありなんか負荷がかかりそうで直したいと考えています。
チューニングや負荷については問題点をはっきりさせることがまず重要だと考えます。それによって対処はかわってくるでしょう。query()は時間のかかる部分ですので、データベースの設計やSQL文の発行のしかた、アクセス方法などquery()以外の部分を見直す必要があると思うのですが。
XOOPSではclassを使っています。定義はclass/databaseにあります。XOOPSでは大抵mainfile.phpをインクルードします。その中でinclude/common.phpがインクルードされ、その中で$xoopsDBに生成されます。よって$xoopsDBがいつでも使える状態にあるという風にしているものと思います。
私もclass(PEAR:DB)を使ってアクセスしています。classを使うことでデータベースの違いを吸収できることと修正を一ヶ所に集中できることがメリットです。ただPHP4とPHP5ではclassに違いがあるので注意が必要です。
XOOPSではSQL文はそれぞれのファイルで個別に記述されていますが私の場合はSQL文もclassの中で定義しています。あらかじめ使うSQL文を登録しておいて、実行時にはidとパラメータを指定するという方法です。自由度を犠牲にすることで攻撃に対して安全になるのではないかと思いまして。
$db->execute(array(SQL_INSERT), array("a", "b"));
array(SQL_INSERT)に対して"INSERT INTO table"を生成します。
array("a", "b")に対して" VALUE (?, ?)"を生成します。
これを結合してsql文を作り、array("a", "b")を引数にしてquery()しています。
コメント(0件)