人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

PHP

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

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

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

●質問者: esecua
●カテゴリ:コンピュータ ウェブ制作
✍キーワード:MySQL PHP phpBB SQL クラス
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● thrillseeker
●35ポイント

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

}


2 ● tobeoscontinue
●35ポイント

>各プログラムに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.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ