0

基本的に、独自のキャッシュシステムを実装しています。理想的には、次のようになります。

$CACHE->start($name);
   //CODE
$CACHE->end();

しかし、それは私が見つけることを望んでいない聖杯です。基本的に、$CACHE->start() はキャッシュがヒットかミスかをチェックし、ヒットした場合は $CACHE->end() まで //CODE をスキップします。

私がこれまでに行った中で最高のものは次のとおりです。

if ($CACHE->start($name)) {
   //CODE
}
$CACHE->end();

PHP は無名関数をサポートしているため、次のことを考えていました。

$CACHE->make($name, function() {
   //CODE
});

しかし、このコードには、コードが同じ変数スコープにないという問題があります。それを回避するチャンスはありますか?

更新:その後、ブロックを関数に渡すことができるルビーに切り替えました。このタスクに最適です。

4

3 に答える 3

2

デフォルトのアプローチはどうですか?以下の例は非常に一般的で、memcached fe で使用されています。

   function doSomething()
   {
       $oCache = SomeRegistry::get('Cache');

       // Check for cached results.
       if ($oCache->exists('someKey')) {
           return $oCache->get('someKey');
       }
       $sCached = getSomeThing();
       $this->set('someKey', $sCached);
       return $sCached;
    }

これは基本的なキー値ストレージであり、クロージャのトリックは必要ありません。

于 2011-11-07T14:39:57.090 に答える
1

Zend Framework には、ページの残りの部分がキャッシュされたコンテンツの一部であると想定してスキップするキャッシュが含まれています。$cache->end()

// Default cache ID is calculated from $_SERVER['REQUEST_URI']
$zendPageCache->start();

// ....

// No need for end

ただし、すべてのユースケースに適合するわけではありません。

(私のコメントの修正版)

于 2011-11-14T21:10:12.303 に答える
1

無名関数では、'use' キーワードを使用して変数をそのスコープに入れることができます。

<?php
function () use ($container, $anythingElseYouMayWantToUse) {
    //...
}

gotoで最初のものを実装することもできますが、それは非常に失礼なアプローチであり、プログラミングの敵と見なされます。

選べるなら2つめに行きます。

于 2011-11-07T14:41:31.007 に答える