• ベストアンサー

頻繁にDBへアクセスするページの効率化(PHP Smarty)について

現在、ひとつのページ内で50以上のSQLコマンド(select)が行われるページを作成しています。 そのページへアクセスする度にサーバへの負荷が懸念されるために悩んでいましたが、 Smartyという対処方法があることを聞いたために、Smartyで作成してみましたが・・・。 Smartyは表示テンプレートを自動で作成するために、差分がない場合にはサーバへの負荷が軽減されることを期待し、参照するSelectの結果値が異ならなければ、SQLサーバへの参照は行かないことを期待していましたが、SQLのログを確認すると、毎回SQLコマンドを投入して同じ値を参照しているように見えています。 Smartyにはテンプレートフォルダが二つあり、差分がない場合には、前回自動作成したテンプレートを使用すると書籍やネットに記載されていたのですが、Smartyの使い方や認識に誤りがあるのでしょうか。 [作成中のページのイメージ] PEAR:Calenderなどを利用してカレンダーを表示して、各日付に該当するデータの有無(個数)を問い合わせて表示するものです(カレンダーの各日付の下に、その日付のデータ数が記載される)。データ数を検索して、カレンダーと表示する機能は、function化しており、テンプレートファイルから呼び出されます。

  • mmei
  • お礼率74% (120/161)
  • PHP
  • 回答数2
  • ありがとう数5

質問者が選んだベストアンサー

  • ベストアンサー
  • masa6272
  • ベストアンサー率66% (93/140)
回答No.1

Smartyで使用するディレクトリで、compile_dirディレクトリにはテンプレートをPHPにコンパイルした結果が入ります。これにより、毎回テンプレートを評価する必要がありません。ただし、これはテンプレートのコンパイルであり、PHPのプログラムは実行されます。 cash_dirディレクトリには、PHPの実行結果のHTMLが格納されます。これを有効にするには、$cashingを1か2に設定し、$cash_lifetimeを設定する必要があります。これによって、$cash_lifetimeの間は以前に作成されたHTMLをそのまま表示します。 ただ、差分があるかどうかは、実行しないと分かりません。キャッシングを有効にしておくと、データに変更があっても時間内は以前のままのページが表示されます。 問題は、50以上のSQL文を発行するというコーディングの方にあるのではないでしょうか。データ数検索を関数としてカプセル化しているようですが、そこで毎回SQL文を発行しているようでしたら、プログラムの組み方そのものを考え直した方が良いのでは・・・

mmei
質問者

お礼

ご回答ありがとうございます。 Smartyについて理解が進みました。 となると、ご指摘の通り、50以上のSQLが毎回発生するindexページはセンスが悪そうなので、別の方法を検討したいと思います。

その他の回答 (1)

  • hide999
  • ベストアンサー率33% (2/6)
回答No.2

カレンダーの場合は、どうしてもSQLのクエリ発行回数が多くなってしまいますね。これは経験してみて始めてわかります 結論から申しますとsmartyでもよいのですが smartyでなくてもphpで簡単にキャッシュさせたることは出来ます。 なのでキャッシュを理由としてsmartyにこだわる必要は無いと思います。

mmei
質問者

お礼

ご回答ありがとうございます。 いろいろと考えた結果、キャッシュに頼った場合、キャッシュ時間によってDBとの不整合が懸念されるために、DBへの書き込みがあった段階でSQLを発行して、カレンダーのHTMLをファイルへ吐き出して、それ以降は、readfileによって吐き出されたHTMLファイルを読み込み方式として進めたいと考えています。

関連するQ&A

  • Smartyの設置について教えてください。

    お名前.COMにて提供しているVPSサーバプランについてですが、どなたかSmartyを設置された方いらっしゃいますか? いつもの通りユーザ階層にSmartyフォルダを設置し、一通りの事を行って、いざアクセスするもページが真っ白で表示されません。 エラーログを見ても普通にSmarty.classには到達しているようで、何が原因なのかわかりません(泣) てすとで通常のPHPページを作成し、現在の日時を表示するよう書き込んでアップしてみましたところ、普通に表示されるので普通にPHPは使えるんだなって感じです。 では、なぜSmartyだけうまく表示できないのでしょうか? 恐らく私の基本的なミスが原因だと思いますが、一応どなたか設置経験のある方がいましたら、設置内容を改めて教えていただければと思います。 どうぞ、宜しくお願いします。 ちなみに設置階層は下記の通りです。 /httpdocs/Smarty/libs/Smarty.class.php /httpdocs/data/cache /httpdocs/data/configs /httpdocs/data/templates /httpdocs/data/templates_c また、トップにあたるindex.phpの中は以下の通りです。 <?php require_once('./Smarty/libs/Smarty.class.php'); $smarty = new Smarty(); $smarty->template_dir = './data/templates/'; $smarty->compile_dir = './data/templates_c/'; $smarty->config_dir = './data/configs/'; $smarty->cache_dir = './data/cache/'; $smarty->display('index.tpl'); ?> アドバイスで構いませんので宜しくお願いします。

    • 締切済み
    • PHP
  • PHP PEARのPagerをSmartyで使う

    初めまして、PEARのPagerを勉強していたのですが、Smartyで実装したいと思い試行錯誤していたらうまく表示されなくて困っています。 【PHP】 //PEARの読み込み、Smartyクラスの読み込み、MySQLクラスの読み込みは省略 //上記は正常に動作しています。 // テーブルの行数を数えます $sql = "SELECT COUNT(*) AS cnt FROM table_name;"; //レコード開始位置指定 $start = 0; //最大レコード数を指定 $limit = 10; // データを取り出すSQLを実行します。 $sql = "select * from table_name ORDER BY no DESC LIMIT $start, $limit"; $result = mysql_query($sql); while($rows = mysql_fetch_array($result)){ $res_data[]=array("title"=>$row['title'],"name"=>$row["name"],"no"=>$row["no"]); } //Pagerのパラメータを指定 $params = array( "itemData" => $res_data, "totalItems" => $limit, "perPage" => 6, "delta" =>5, "mode" =>"Jumping" ); //パラメータの連想配列を受け取る $pager =& Pager::factory($params); // ページデータの割り当て処理 foreach($pager->getPageData() as $item){ $res_data_page[] = $item; } //戻る/次/最初/最後のリンクとページリンクを返す $link = $pager -> getLinks(); //現在のページ番号を返す $currentPageID = $pager -> getCurrentPageID(); // テンプレート用に変数を設定 $smarty->assign('data', $res_data_page); $smarty->assign('pageNavi', $link['all']); $smarty->assign('currentPage', $currentPageID); ■tpl <table border="1"> <tr> <th>名前</th> <th>NO</th> <th>タイトル</th> </tr> {foreach from=$data item=i} <tr> <td>{$i.name}</td> <td>{$i.no}</td> <td>{$i.title}</td> </tr> {/foreach} </table> <p>{$pageNavi}</p> <p>{$currentPage}ページを表示</p> 参考URL http://meerweb.blog7.fc2.com/blog-entry-101.html データベースへの接続は出来ていて、ページャー機能は動いています。 取得しているデータ数もあっているのですが、全部1行目のデータだけ表示されます。 どなたか原因が分かる方いらっしゃいましたら、是非ともご教授ください。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • smartyのページキャッシュについて

     例えば動的に表示するページにおいて、DBへ登録処理が行われた時に同時にsmartyでページキャッシュを作成するということを実現したいのですが、ページキャッシュを作成する方法は、キャッシュの有効期限を設定する方法しかないのでしょうか?  こうすることで、一部の動的ページを静的と同じ速度で表示できるのかなと考えているのですが、ご存知の方よろしくお願いします。  PHP5.1.1  smarty2.6.5

    • 締切済み
    • PHP
  • PHPとSmartyの関連について

    PHPとSmartyの関連について PHPからSmartyに出力しているのですが中身がNULLになります。 データベースアクセスにはPDOを使用しています。 PHPソース DBアクセス $SQL = "select ITEM_ID from ITEM_TBL limit 0, 3"; $STMT = $GLOBALS["PDO"] -> query($SQL); $ROW = $STMT -> fetchAll(PDO::FETCH_ASSOC); Smartyでアサイン $smarty -> assign("ITEM_LIST", $ROW); Smartyソース <table> {{foreach from=$ITEM_LIST item=LIST}} <tr> <td>{{$LIST.ITEM_ID}}</td> </tr> {{/foreach}} </table> のような感じでページ出力したいのですが、表示をすると中身がNULLでした。 PHP側で var_dump($ROW); を行うと array(3) { [0]=> array(1) { ["ITEM_ID"]=> string(1) "1" } [1]=> array(1) { ["ITEM_ID"]=> string(1) "2" } [2]=> array(1) { ["ITEM_ID"]=> string(1) "3" } } 中身が配列で格納されています。 smarty側で {$ITEM_LIST|@var_dump} を行うと array(3) { [0]=> NULL [1]=> NULL [2]=> NULL } でした。 いろいろとやってみたのですが、わからなくなってしまったので どなたかご教授いただけませんでしょうか。よろしくお願いします。

    • 締切済み
    • PHP
  • Smartyについて

    PHPとSmartyでカレンダーを製作しております。 カレンダーを以下の配列に格納し、テンプレートで表示しています。 $cal = Array([0] => Array([0] => [1] => [2] => [3] => 1 [4] => 2 [5] => 3 [6] => 4) [1] => Array([0] => 5 [1] => 6 [2] => 7 [3] => 8 [4] => 9 [5] => 10 [6] => 11) [2] => Array([0] => 12 [1] => 13 [2] => 14 [3] => 15 [4] => 16 [5] => 17 [6] => 18) [3] => Array([0] => 19 [1] => 20 [2] => 21 [3] => 22 [4] => 23 [5] => 24 [6] => 25) [4] => Array([0] => 26 [1] => 27 [2] => 28 [3] => 29 [4] => 30 [5] => 31 [6] => )) テンプレートは以下です。(一部のみ) {section name=index loop=$cal} <tr> <td> {$cal[index].0} </td> </tr> (以下省略) {section} これで、カレンダーは表示できていますが、これに付加して、 10日、15日、20日、30日の<td>のバックカラーを変えたいのです。 そこで、以下の配列をテンプレートに渡し、実現したいのですが 上記のテンプレートにどう組み込めばいいのかをご教授下さい。 $day = Array([0] => Array([0] => 10 ) [1] => Array([0] => 15 ) [2] => Array([0] => 20 ) [3] => Array([0] => 30 ))

    • ベストアンサー
    • PHP
  • zendにsmarty3の組込で

    こちらのページを参考に表示にsmartyを入れてみました。 http://www.phppro.jp/school/smarty/vol12/2 ※smartyは3.0.6でzendは1.11.3です indexActionで格納した変数はtplで表示されているので組込は 成功しているかと思うのですが下記のようなエラーが表示されます。 Warning: include_once(Smarty\Internal\Data.php) Warning: include_once(Smarty\Internal\Template.php) ファイルを確認すると確かに該当データがありません。 smarty3なのでフォルダ名がInternalではなくsyspluginsに変わって いる事が原因かと思うのですがどのように対処すればいいでしょうか?

    • ベストアンサー
    • PHP
  • Access【データアクセスページ】を使われてる方教えて下さい

    Accessのデータを社内で閲覧したいと思っています。 Accessの入っていないPCからも見れるよう、データアクセスページで作成したhtmをサーバに置く予定です。 しかし、作成したPCからは、問題なく検索・表示ができるのですが、サーバに置き、他のPCから見るとラベル以外表示されません。(mdbはサーバに置いてあります) 試しに、他のPC上で作成してみたのですが、やはり作成したPCからしか正常に表示されませんでした。 自分なりに、調べては見たのですがいきずまってしまいました。 SQLサーバを使うしかないのでしょうか? その場合、元データがExcelからリンクしたものを、自動更新でテーブルに追加させているのですが、SQL上にAccessのテーブルをリンクさせたりって出来るのでしょうか? お詳しい方、アドバイスお願いします。

  • SmartyでMySQLに登録したテンプレートを使用するには?

    現在、Smartyを使用してブログを作成しようとしています。 テンプレートファイル(htmlソース)をMySQLに登録し、 これを呼び出して出力する方法を教えてください。 ※各ユーザーでレイアウトを変更するため Smartyマニュアルの「テンプレートリソース」等を確認しましたが、 なかなかうまく表示されません。 http://smarty.php.net/manual/ja/template.resources.php MySQLに「template」フィールド作成し、ここにHTMLソースを記述しています。 試した方法は 1.display時に「template」フィールドを呼び出し ×変数が呼び出されない 2.custom.tplを作成し、「template」フィールドをecho。そしてdisplay ×変数がそのまま出力 3.「テンプレートリソース」の利用 ×うまく表示されない クラス「SQL」を作成しないといけない? サンプルや他に方法が記載されているサイトがあれば教えてください。

    • 締切済み
    • PHP
  • smaryテンプレートを使う上で、Smartyオブジェクトを二つ作成し

    smaryテンプレートを使う上で、Smartyオブジェクトを二つ作成し、それぞれのそのなかの変数をひとつのテンプレートに表示するという方法は可能でしょうか?つまりそれぞれを同じテンプレートに表示する、という方法はできるのでしょうか?PHPは下記のようになります。 $smarty = new Smarty(); $smarty2 = new Smarty(); $smarty->assign('abc', $def); $smarty2->assign('ghi', $jkl); $smarty->display('aaa.tpl'); $smarty2->display('aaa.tpl'); それとも、オブジェクトと表示するテンプレートは1つずつでないといけないとだめで、$smartyと$smarty2は、どっちかひとつに統一する必要があるのでしょうか?

    • ベストアンサー
    • PHP
  • Smartyのテンプレート

    出来なくて困っていることがあります。 Smartyのテンプレートは通常「templates」フォルダに格納すると思いますが、そのファイルを書き換えることは可能でしょうか? 流れとして PHPで既存のテンプレートを表示 ↓ その中のPOSTデータを元に既存のテンプレートを上書きして保存 fopenのwで開き、smarty->fetchで情報を載せたデータを作り、fwriteで同じファイルに上書きしようとおもったのですが、うまくいきません。 そもそもtemplatesフォルダの中身をプログラムで更新できるものなのか、できるならどのようにするのがよいのか、お分かりになる方がいましたらご教授願います。

    • 締切済み
    • PHP

専門家に質問してみよう