0

現在、mvc ベースのサイトで php と apc を使用しています。これはカスタム ビルドの単純な mvc であるため、ニーズに合わせてビルドしようとしています。

ただし、キャッシュを処理するのに適した場所はどこですか?

私には2つの選択肢があります(私が思うに)..オブジェクトがキャッシュに保存されたことを意味するさまざまなコントローラーですべてのキャッシュを行うか、クエリから返されたデータをメソッド内のキャッシュに保存します。

コントローラーの例:

function showPage() {

    $pageOb = new Page();

    $key = md5('pageOb->getQuery()');

    if(!$data = apc_fetch($key)){

        $data = $pageOb->getQuery();
        apc_add($key, $data, 600);
    }

    require 'template.php';
}   

メソッドの例:

function getQuery(){

    $sql = "SELECT * FROM table";
    $key = md5('query'.$sql);

    if(!$data = apc_fetch($key)){   

        $core = Connect::getInstance();
        $stmt = $core->dbh->prepare($sql);
        $stmt->execute();
        $data = $stmt->fetchAll();
        apc_add($key, $data, 600);
    }

    return $data;
}
4

2 に答える 2

2

モデルレイヤーをどのように理解し、実装するかによって少し異なります。これは、サービス レベル オブジェクトでキャッシュ関連のコードを記述する方法です。

$user = $this->domainObjectFactory->build('User');
$user->setId(42);

if ( !$this->cacheMapper->fetch('User', $user) )
{
    $mapper = $this->mapperFactory->build('User');
    $mapper->fetch($user);
}

用語を理解していない場合は、このコメント(「サイド ノート」にスキップ) が役立つ場合があります。すべてをもう一度繰り返すには時間がかかりすぎます。

私が理解しているように、キャッシュ自体は別の形式のストレージです。したがって、これはデータ ソース レイヤーの別の部分にすぎません (マッパー、DAO、および同様の構造が発生する場所)。

于 2012-05-31T20:07:10.937 に答える
1

コントローラーにバブルアップするデータモデルの懸念があるべきではありません。この原則は SRP にカプセル化されています: http://en.wikipedia.org/wiki/Single_responsibility_principle

2番目のソリューションの方が優れていますが、データソースからのデータの取得をさらに抽象化することで改善されます。使用されている言語は異なりますが、パターンはまだ保持されていますが、これについては良い参考記事があります: http://www.alachisoft.com/resources/articles/domain-objects-caching-pattern.html

于 2012-05-31T18:14:16.480 に答える