PHP + smarty について質問です。


smartyのキャッシュ機能を利用してPHP+mysqlの処理を軽減したく、
下記のようにmysql処理をキャッシュが存在する場合は処理せず、
キャッシュがない場合のみ処理するようにしたいです。


require './libs/Smarty.class.php';
$smarty = new Smarty();
$smarty->template_dir = './templates/';
$smarty->compile_dir = './templates_c/';
$smarty->cache_dir = './cache/';

//ここの部分をキャッシュあるなしで処理したいです
$posts = mysql_query("SELECT * from ***") or die(mysql_error());
while ($pot = mysql_fetch_array($posts)) {
$post[] = $pot;
}
$smarty->assign('post', $post);
$smarty->display( 'index.tpl');


ここからどのように追記すればいいかわからなくなってしまいました。
ご存じの方いらっしゃいましたらご教授お願いします。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/07/17 13:19:56
  • 終了:2013/07/22 14:27:12

ベストアンサー

id:gizmo5 No.2

gizmo5回答回数484ベストアンサー獲得回数1382013/07/17 20:59:32

ポイント200pt

isCached メソッドを使って判定します。

//ここの部分をキャッシュあるなしで処理したいです
if(!$smarty->isCached('index.tpl')) {
	$posts = mysql_query("SELECT * from ***") or die(mysql_error());
	while ($pot = mysql_fetch_array($posts)) {
		$post[] = $pot;
	}
	$smarty->assign('post', $post);
}
$smarty->display( 'index.tpl');

参考URL。
http://deverock.in/posts/php/%E3%81%BE%E3%81%A0%E3%81%BE%E3%81%A0%E4%BD%BF%E3%81%88%E3%82%8BSmarty%E3%80%8C%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%86%E3%80%8D

id:numb08

これはindex.tplのキャッシュがあればDBを参照せずキャッシュから表示し、なければDBからデータをもってくるという動作でしょうか?
現状index.phpを表示する度にDB接続しているため負担が大きく、これを解消するために考えています。

2013/07/18 12:31:56
id:gizmo5

そうです。
有効なキャッシュが存在しない場合にのみ if文の中を実行します。
キャッシュのありなしは生存期間で制御します。
キャッシュの生存期間中にDBの内容が更新されると、表示が一時的に古いままということになります。

2013/07/20 15:33:46

その他の回答(2件)

id:dawakaki No.1

だわかき回答回数797ベストアンサー獲得回数1222013/07/17 18:47:21

ポイント50pt

Smartyのキャッシュ機能について誤解があるようです。

Smartyのキャッシュ機能は、ブラウザの画面に表示させる内容をキャッシュさせるのであって、MySQLのクエリー結果をキャッシュするわけではありません。

MySQLのクエリーをキャッシュしたいのであれば、下記の処理を行います。
http://dev.mysql.com/doc/refman/4.1/ja/query-cache.html

id:gizmo5 No.2

gizmo5回答回数484ベストアンサー獲得回数1382013/07/17 20:59:32ここでベストアンサー

ポイント200pt

isCached メソッドを使って判定します。

//ここの部分をキャッシュあるなしで処理したいです
if(!$smarty->isCached('index.tpl')) {
	$posts = mysql_query("SELECT * from ***") or die(mysql_error());
	while ($pot = mysql_fetch_array($posts)) {
		$post[] = $pot;
	}
	$smarty->assign('post', $post);
}
$smarty->display( 'index.tpl');

参考URL。
http://deverock.in/posts/php/%E3%81%BE%E3%81%A0%E3%81%BE%E3%81%A0%E4%BD%BF%E3%81%88%E3%82%8BSmarty%E3%80%8C%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E6%A9%9F%E8%83%BD%E3%82%92%E4%BD%BF%E3%81%86%E3%80%8D

id:numb08

これはindex.tplのキャッシュがあればDBを参照せずキャッシュから表示し、なければDBからデータをもってくるという動作でしょうか?
現状index.phpを表示する度にDB接続しているため負担が大きく、これを解消するために考えています。

2013/07/18 12:31:56
id:gizmo5

そうです。
有効なキャッシュが存在しない場合にのみ if文の中を実行します。
キャッシュのありなしは生存期間で制御します。
キャッシュの生存期間中にDBの内容が更新されると、表示が一時的に古いままということになります。

2013/07/20 15:33:46
id:kaji0120 No.3

kaji0120回答回数59ベストアンサー獲得回数132013/07/21 12:53:07

ポイント50pt

些細な指摘なのですが、

>現状index.phpを表示する度にDB接続しているため負担が大きく、これを解消するために考えています。

接続する際はmysql:ではなく、mysqli:を使用すると負担が2割改善します。
これはmysql_fetch_arrayも同様です。

将来的にはmysqliが標準化されるので、smartyを使用するのであれば可能な限りmysqliを使用したほうがよろしいかと思います。

http://otukutun.hatenablog.com/entry/2013/01/29/225140

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

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

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

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

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