要するに:
- プリコントローラーフックはキャッシュ中に実行されますか?いいえ。
- 実行するフックポイントはありますか? はい
pre_system
、実行します。
キャッシュがsystem/core / CodeIgniter.php:189で開始された場合、実行の機会を得る唯一のフックはpre_system
(system / core / CodeIgniter:124)です。
残念ながら、その時点ではcodeigniterの機能はあまり得られません。それがないget_instance()
と、ほとんどのコアライブラリもロードされません。あなたが傾いているなら、あなたはsystem/core/Common.php
あなたが得たほとんどすべての中でどの関数が定義されているかを調べることができます。
組み込みのクラスを使用してこれを実際に機能させたい場合は、データベースオブジェクトや次のような他のコアなものへの道を戦うことができます。
- に含まれるファイルを手動で取得する必要があり
BASEPATH.'database/DB.php'
ます。幸い、ローダークラスでは、ファイルが読み込まれるrequire_once
ため、キャッシュミスでページが破損することはありません。
Database
ライブラリをロードしたら、$this->db
を呼び出して通常のオブジェクトをインスタンス化しますDB()
。パラメータがないと、通常どおり構成ファイルからデフォルトのデータベースがロードされます。
- この時点で、
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関連のクラスに触れることなく処理できます。