PHP


現在MySQLと連動したスクリプトを作成しているのですが、各プログラムにSQL、mysql_query()がありなんか負荷がかかりそうで直したいと考えています。

規模の大きいプログラム(phpbbなど)はどのようにしてSQLをまとめているのでしょうか?クラスなどを使用しているのでしょうか?

詳しくサンプルつきで説明お願いします。(最高130ポイント)

回答の条件
  • 1人5回まで
  • 登録:2006/10/22 15:25:58
  • 終了:2006/10/29 15:30:03

回答(2件)

id:thrillseeker No.1

thrillseeker回答回数328ベストアンサー獲得回数372006/10/22 23:15:07

ポイント35pt

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);

}

id:tobeoscontinue No.2

tobeoscontinue回答回数214ベストアンサー獲得回数542006/10/25 14:18:12

ポイント35pt

>各プログラムに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()しています。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません