3

私は自分の小さなPHPMVCフレームワークを作成し、現在はPHPMVCフレームワークのキャッシュ戦略を検討しています。何を、どこで、どのようにキャッシュできるかを考えています。

私が持っているフレームワークは単純なMVCフレームワークです。私はフロントコントローラーを持っています。これはアプリケーションを起動し、クラスの自動読み込みを登録し、phpランタイムディレクティブを設定します...そして最後にURLを分析し、適切なコントローラー、メソッド、アクションコントローラーにリクエストをディスパッチします。コントローラーから、ドメインオブジェクト、およびドメインオブジェクトを一部のストレージ(ほとんどの場合はリレーショナルデータベース)に永続化できるデータマッパーにアクセスできます。コントローラから、ドメインオブジェクトとデータマッパーにアクセスできます。

キャッシングに関する限り、これらは私が今できることを私が知っていることです。PHPでは、オペコードキャッシュであるAPCキャッシュを使用できますが、変数をRAMに保存するためにも使用できます。次に、APCキャッシュとして機能するMemcacheとMemcahedを使用できますが、スケーリングする必要がある場合は、異なるサーバーから保存されたキャッシュにアクセスできます。そして、これら2つはオペコードキャッシュではありません。

私が知る限り、私はこれらのことを行うことができます:

  1. コントローラにいるときは、ドメインオブジェクトをキャッシュに保存できるので、そのドメインオブジェクトがすでにキャッシュにある場合は、毎回データベースへの接続を開く必要はありません。

  2. ブートストラップでURLを分析し、そのページのURLを含むキャッシュが存在する場合は、そのURLの解釈済みページを取得するキャッシュシステムを構築できます。存在しない場合は、リクエストを処理してそのページをキャッシュに保存し、現在のURLに関連付けます。

ご覧のとおり、MVCにキャッシュを実装する方法と、キャッシュする場所、方法、可能性についてはよくわかりません。

それで、誰かがこれをよりよく説明することができますか、または私がキャッシュについて学ぶことができるいくつかの良い記事に私をリダイレクトすることができますか?

ありがとう!

4

1 に答える 1

9

オペコードキャッシュは、リクエストごとにPHPコードを解釈するコストを相殺するためにあります。これはサーバーインフラストラクチャに関連しています。ちょっと負荷分散が好きです。管理者にお任せください。または、* NIXディストリビューションを使用したことがある人、それはubuntuではありません。

MVCアプリケーションには、キャッシュできる3つのポイントがあります。

  • 周辺:

    MVCパターン自体には実際には関連していないが、MVCへのアクセスに関与しているアプリケーションの部分:ルーティングメカニズムと(使用している場合は)DIC。

    ルーティングメカニズムのためにキャッシュできるものは、実装によって異なります。より読みやすいパターンからの正規表現生成を使用している場合は、生成された式にキャッシュできます。また、通常はルートによって生成されるパラメータの一部をキャッシュすることもできます。これらは両方とも中規模/大規模のサイトでは合理的であり、小規模なサイトでは完全に無意味です

    DICを使用することにした場合(個人的にはアンチパターンだと思いますが、すべてのクールな子供たちは同意しません)、正しく記述されたDICは反射を利用するため、キャッシュはほぼ必須です。そして、反射は遅いです。

  • 応答

    アプリケーションの一部で、作成に多くのリソースが必要になる場合があります。MVC解釈に完全に実現されたビューがある場合、出力の生成に使用されるテンプレートの一部をキャッシュすることができます。

    たとえば、StackOverflowのようなサイトを考えてみましょう。サイドバーに「過去24時間のトップタグ」ブロックを作成することにした場合、ページビューごとにそれを再生成することは不可能です。この制限を回避する1つの方法は、タグを1時間程度ごとに再カウントし、生成された結果をHTMLフラグメントに保存することです。このフラグメントは、何度も再利用できます。キャッシュされたフラグメントがXHRで使用されるJSONである場合は、クライアント側の期限切れヘッダーを追加して、サーバーの負荷をさらに減らすこともできます。

    ページの一部のみ、または全体をキャッシュできます。これは基本的に、MVCが組み込まれたアーキテクチャを備えたサイトで、静的コンテンツを持つパーツを処理する方法です。

  • モデルレイヤー

    これはトリッキーなビットです。

    まず、キャッシュは単なる別の形式のストレージであることを理解する必要があります。つまり、キャッシュは特別なマッパーによって処理されます。

    $user = new User;
    $cache = new UserCacheMapper;
    
    $user->setId( 42 );
    if ( ! $cache->fetch( $user ) )
    {
        $storage = new UserDbMapper( $pdo );
        $storage->fetch( $user );
    
        $cache->store( $user );
    }
    
    // the $user object has been initialized
    

    キャッシュマッパーは、キャッシュの無効化が発生する場所でもあり、このようにして、プロジェクトの任意の段階でキャッシュメカニズムを追加できます。

    ただし、ドメインオブジェクトとストレージ間の相互作用を処理するためのコントローラーの使用を停止することをお勧めします。基本的に、プレゼンテーション層でドメインビジネスロジックをリークしています。アプリケーションのこの部分を含むサービスを作成し、コントローラーをドメインロジックから分離できるようにすることをお勧めします。

于 2012-10-22T01:28:51.270 に答える