简而言之:
- 缓存期间是否执行预控制器挂钩?没有。
- 是否有任何会执行的挂钩点? 是
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
钩子中编写查询,并且由于钩子可以是对象,因此您可以将每个日志记录代码移动到钩子的对象中。如果您需要其他库,您可以使用该函数获取它们的实例(如果您没有加载内置类,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 相关的类即可。