CodeIgniter(预控制器)挂钩和缓存

Fer*_*don 5 php ajax caching codeigniter

摘要:

在缓存期间执行预控制器挂钩吗?是否有任何钩点将执行?(预制?)

我应该强调钩子不会影响发送到浏览器的内容这一事实.这不是问题.


详细版本:

我计划在我使用PHP和CodeIgniter构建的项目中实现一些统计类型功能.

有问题的项目是一个定制的CMS - 由于更新之间的间隔延长,我使用缓存来帮助加快加载时间; 这不是必要的,但它是优惠的.它似乎是一个很大程度上静态站点的好解决方案; 特别是在动态内容主要在客户端提供的情况下 - 即AJAX请求.

所提出的功能主要涉及预控制器钩子,该钩子在将它们转储到数据库之前通过诸如用户代理库之类的库来访问方法.从这里可以轮询,通过JSON输出并在被jQuery flot插件之类的东西显示之前进行操作.

我已经阅读了有关Web页面缓存文档以及有关钩子文档.不幸的是,仍然不清楚使用缓存是否会完全绕过钩子.

我知道cache_override这意味着这意味着实现自己的缓存机制; 不是我想做的!

另一种方法是收集统计客户端并通过AJAX将其提交给服务器; 但这并不理想,因为我试图明确分离逻辑 - 出于维护和测试的原因.

com*_*857 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钩子中编写查询,并且由于钩子可以是对象,因此您可以将每个日志记录代码移动到钩子的对象中.如果您需要其他库,您可以使用该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(), /*...*/);
    } 
}
Run Code Online (Sandbox Code Playgroud)

我应该提一下,我从来没有在生产中使用过这样的东西,并且存在可能因版本而异的功能转换的风险.如果你可以不触摸你的钩子里面的Codeigniter类就可以了.

使用PDO进行数据库访问,使用加载数据库配置get_config(),您可以在不触及任何与codeigniter相关的类的情况下使用.