5

概要:

プリコントローラーフックはキャッシュ中に実行されますか?実行するフックポイントはありますか?(システム前?

フックがブラウザに送信されるコンテンツに影響を与えないという事実を強調する必要があります。それは問題ではありません。


詳細バージョン:

PHPとCodeIgniterを使用して構築したプロジェクトに、いくつかの統計タイプの機能を実装する予定です。

問題のプロジェクトはカスタムビルドのCMSです。更新の間隔が長いため、読み込み時間を短縮するためにキャッシュを使用しました。これは必須ではありませんが、優先的です。これは、ほとんど静的なサイトに対する優れたソリューションのようです。特に動的コンテンツが主にクライアント側で提供される場合、つまりAJAXリクエスト。

提案された機能には、主に、データベースにダンプする前に、ユーザーエージェントライブラリなどのライブラリを介してメソッドにアクセスするプリコントローラフックが含まれます。ここから、jQuery flotプラグインなどで表示する前に、ポーリング、JSON経由での出力、操作を行うことができます。

Webページキャッシングドキュメントとフックに関するドキュメントを読みました。残念ながら、キャッシングを使用するとフックが完全にバイパスされるかどうかはまだ明らかではありません。

私は知っていますが、cache_overrideこれは独自のキャッシュメカニズムを実装することを意味します。私がやりたいことではありません!

別の方法は、統計クライアント側を収集し、AJAXを介してサーバーに送信することです。しかし、メンテナンスとテストの理由から、ロジックを明確に分離しようとしているため、これも理想的ではありません。

4

1 に答える 1

10

要するに:

  • プリコントローラーフックはキャッシュ中に実行されますか?いいえ
  • 実行するフックポイントはありますか? はい pre_system、実行します。

キャッシュがsystem/core / CodeIgniter.php:189で開始された場合、実行の機会を得る唯一のフックはpre_system(system / core / CodeIgniter:124)です。

残念ながら、その時点ではcodeigniterの機能はあまり得られません。それがないget_instance()と、ほとんどのコアライブラリもロードされません。あなたが傾いているなら、あなたはsystem/core/Common.phpあなたが得たほとんどすべての中でどの関数が定義されているかを調べることができます。

組み込みのクラスを使用してこれを実際に機能させたい場合は、データベースオブジェクトや次のような他のコアなものへの道を戦うことができます。

  1. に含まれるファイルを手動で取得する必要がありBASEPATH.'database/DB.php'ます。幸い、ローダークラスでは、ファイルが読み込まれるrequire_onceため、キャッシュミスでページが破損することはありません。
  2. Databaseライブラリをロードしたら、$this->dbを呼び出して通常のオブジェクトをインスタンス化しますDB()。パラメータがないと、通常どおり構成ファイルからデフォルトのデータベースがロードされます。
  3. この時点で、pre_systemフックからクエリを記述できます。フックはオブジェクトになる可能性があるため、すべてのロギングコードをフックのオブジェクト内に移動できます。他のライブラリが必要な場合は、関数を使用してそれらのインスタンスを取得できます(組み込みクラスをロードしない場合は、3番目のプレフィックスload_class()パラメータを空の文字列に設定することを忘れないでください)。

最後に、次のようになります(架空のコード):

class MyLoggingHook {
    // called from the hook config
    public function run($params = array()) {
        require_once(BASEPATH.'database/DB.php');
        $db = DB(); // getting hold of a DAO instance

        // routing information is always useful to have for pageview logs
        $RTR = load_class('Router', 'core');
        $RTR->_set_routing();
        // Router also load Uri and Config classes inside so the following two instances could be interesting too:
        // $RTR->uri 
        // $RTR->config

        // load some useful library not related to CodeIgniter
        $user_agent_detector = load_class('UserAgentDetector', 'libraries', '');

        // do some logging
        $db->insert('page_view_log', array('class' => $RTR->fetch_class(), 'method' => $RTR->fetch_method(), /*...*/);
    } 
}

私は本番環境でこのようなものを使用したことがなく、バージョンごとに変更される可能性のある機能性を中継するリスクがあることをおそらく言及する必要があります。フック内のCodeigniterクラスに触れずにできる場合は、それを使用してください。

データベースアクセスにPDOを使用し、データベース構成をでロードするとget_config()、codeigniter関連のクラスに触れることなく処理できます。

于 2012-12-07T23:10:57.133 に答える