- ベストアンサー
頻繁にDBへアクセスするページの効率化(PHP Smarty)について
現在、ひとつのページ内で50以上のSQLコマンド(select)が行われるページを作成しています。 そのページへアクセスする度にサーバへの負荷が懸念されるために悩んでいましたが、 Smartyという対処方法があることを聞いたために、Smartyで作成してみましたが・・・。 Smartyは表示テンプレートを自動で作成するために、差分がない場合にはサーバへの負荷が軽減されることを期待し、参照するSelectの結果値が異ならなければ、SQLサーバへの参照は行かないことを期待していましたが、SQLのログを確認すると、毎回SQLコマンドを投入して同じ値を参照しているように見えています。 Smartyにはテンプレートフォルダが二つあり、差分がない場合には、前回自動作成したテンプレートを使用すると書籍やネットに記載されていたのですが、Smartyの使い方や認識に誤りがあるのでしょうか。 [作成中のページのイメージ] PEAR:Calenderなどを利用してカレンダーを表示して、各日付に該当するデータの有無(個数)を問い合わせて表示するものです(カレンダーの各日付の下に、その日付のデータ数が記載される)。データ数を検索して、カレンダーと表示する機能は、function化しており、テンプレートファイルから呼び出されます。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
Smartyで使用するディレクトリで、compile_dirディレクトリにはテンプレートをPHPにコンパイルした結果が入ります。これにより、毎回テンプレートを評価する必要がありません。ただし、これはテンプレートのコンパイルであり、PHPのプログラムは実行されます。 cash_dirディレクトリには、PHPの実行結果のHTMLが格納されます。これを有効にするには、$cashingを1か2に設定し、$cash_lifetimeを設定する必要があります。これによって、$cash_lifetimeの間は以前に作成されたHTMLをそのまま表示します。 ただ、差分があるかどうかは、実行しないと分かりません。キャッシングを有効にしておくと、データに変更があっても時間内は以前のままのページが表示されます。 問題は、50以上のSQL文を発行するというコーディングの方にあるのではないでしょうか。データ数検索を関数としてカプセル化しているようですが、そこで毎回SQL文を発行しているようでしたら、プログラムの組み方そのものを考え直した方が良いのでは・・・
その他の回答 (1)
- hide999
- ベストアンサー率33% (2/6)
カレンダーの場合は、どうしてもSQLのクエリ発行回数が多くなってしまいますね。これは経験してみて始めてわかります 結論から申しますとsmartyでもよいのですが smartyでなくてもphpで簡単にキャッシュさせたることは出来ます。 なのでキャッシュを理由としてsmartyにこだわる必要は無いと思います。
お礼
ご回答ありがとうございます。 いろいろと考えた結果、キャッシュに頼った場合、キャッシュ時間によってDBとの不整合が懸念されるために、DBへの書き込みがあった段階でSQLを発行して、カレンダーのHTMLをファイルへ吐き出して、それ以降は、readfileによって吐き出されたHTMLファイルを読み込み方式として進めたいと考えています。
お礼
ご回答ありがとうございます。 Smartyについて理解が進みました。 となると、ご指摘の通り、50以上のSQLが毎回発生するindexページはセンスが悪そうなので、別の方法を検討したいと思います。