私はこの変数の考え方があまり好きではありません: ビューまたはコントローラーのいずれかにコードを追加し、気分が良くありません。
一方、私はこのキャッシュのアイデアが好きです...複雑すぎる/やり過ぎだと思うならイベント。
途中で道を見つけてみませんか?file/APC/memcache のようなキャッシュを使用せず、スクリプトの実行のためにデータをメモリに保持しますか?
そのために静的変数を使用できます。クラス内、またはメソッド内で直接(「クラスのメソッド間でそのキャッシュを共有することは理にかなっていますか?」に応じて)
この考え方を説明するために、コードの一部を簡単に示します。このクラスを検討してください:
class A {
public function test($param) {
static $cache = array();
if (isset($cache[$param])) {
var_dump("cache hit : $param = {$cache[$param]}");
return $cache[$param];
} else {
// Fetch from DB (here, simulated ^^ )
$cache[$param] = mt_rand(0, 9999);
var_dump("cache miss : $param = $cache[$param]");
return $cache[$param];
}
}
}
このtest
メソッドは、DB からフェッチされたデータを格納するために静的変数 (クラスのインスタンスによって共有される、その変数のインスタンスが 1 つだけ存在します) を使用します。
これをそのように呼び出す場合:
$a = new A();
$b = new A();
$a->test(10); // miss
$a->test(15); // miss
$b->test(10); // hit
$b->test(25); // miss
$a->test(25); // hit
あなたはこれを得るでしょう:
string 'cache miss : 10 = 3745' (length=22)
string 'cache miss : 15 = 7800' (length=22)
string 'cache hit : 10 = 3745' (length=21)
string 'cache miss : 25 = 8623' (length=22)
string 'cache hit : 25 = 8623' (length=21)
メソッドが新しいパラメーターで呼び出されるたびに、それはミスであり、DB に移動します。しかし、パラメータがすでに一度使用されているときに呼び出されると、データはメモリ内にあり、DBには移動しません;-)
それは役に立ちませんか?あなたの場合、A
クラスはビューヘルパーであると推測しています;-)そしてmt_rand
、DBクエリになります^^
補足として:これは大きすぎるオブジェクトに対して行うべきではありません.RAMを使用するためです...そしてそれらの多くはありません...
編集: Zend Framework を使用しているので、その静的変数の代わりに使用することに興味があるかもしれませんZend_Memory
: RAM の使用量などを処理します (たとえば、必要に応じて「キャッシュ」からデータを削除できます)。正しく覚えてください。
また:はい、あなたはまだメソッドを何度も呼び出しています...しかし、クエリを実行するよりはましです...そして、この方法では、ビューもコントローラーもあらゆる種類の「キャッシュ」を気にする必要はありません:それは彼らのものではありません仕事。
また、私はこのテクニックを何年も問題なく使用しています(この方法で小さなオブジェクトのみを保存し、あまり多くない限り)。これを使っているのは私だけではありません。たとえば、Drupal もこれを使用します。