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

Php CodeIgniter(预控器)挂钩和缓存,php,ajax,codeigniter,caching,Php,Ajax,Codeigniter,Caching,摘要: 预控制器挂钩是否在缓存期间执行?是否有任何将执行的挂钩点?(预系统?) 我可能应该强调一个事实,即钩子不会影响发送到浏览器的内容。这不是问题 详细版本: 我计划在使用PHP和CodeIgniter构建的项目中实现一些统计类型的功能 所讨论的项目是一个定制的CMS-由于更新间隔的延长我已经使用缓存来帮助加快加载时间;这不是必需的,但它是优先的。这似乎是一个很好的解决方案,主要是静态网站;特别是在动态内容主要由客户端提供服务的情况下,即AJAX请求 建议的功能主要涉及一个预控制器钩子,该钩

摘要:

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

我可能应该强调一个事实,即钩子不会影响发送到浏览器的内容。这不是问题


详细版本:

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

所讨论的项目是一个定制的CMS-由于更新间隔的延长我已经使用缓存来帮助加快加载时间;这不是必需的,但它是优先的。这似乎是一个很好的解决方案,主要是静态网站;特别是在动态内容主要由客户端提供服务的情况下,即AJAX请求

建议的功能主要涉及一个预控制器钩子,该钩子在将方法转储到数据库之前,通过诸如用户代理库之类的库访问方法。从这里,它可以被轮询,通过JSON输出,并在被jQueryFlot插件显示之前进行操作

我已经阅读了上的文档以及。不幸的是,现在还不清楚使用缓存是否会完全绕过挂钩

我知道
cache\u override
但是这意味着实现您自己的缓存机制;不是我想做的

另一种方法是在客户端收集统计数据,并通过AJAX将其提交给服务器;但这也不理想,因为出于维护和测试的原因,我正试图对逻辑进行清晰的分离。

简而言之:

  • 预控制器挂钩是否在缓存期间执行
  • 是否有任何将执行的挂钩点
    预处理系统
    执行

如果缓存起作用,那么唯一有机会运行的钩子就是

不幸的是,此时您没有获得codeigniter的很多功能,没有
get_instance()
,没有这些功能,大多数核心库也无法加载。如果你愿意的话,你可以看看里面定义了什么函数,这几乎就是你的全部

如果您真的想利用内置类实现这一点,您可以通过某种方式创建数据库对象和其他类似的核心内容:

  • 您必须手动获取中包含的
    BASEPATH.database/DB.php'
    文件。幸运的是,在loader类中,它加载了,因此不会在缓存未命中时中断页面
  • 加载
    数据库
    库后,通过调用实例化通常的
    $this->db
    对象。如果没有参数,它将像往常一样从配置文件加载默认数据库
  • 此时,您可以从
    pre_系统
    hook编写查询,因为hook可以是对象,所以您可以在hook的对象中移动每个日志代码。如果需要其他库,可以使用函数获取它们的实例(如果不加载内置类,请不要忘记将第三个prefix参数设置为空字符串)
  • 最后,您应该这样结束(想象代码):

    类MyLoggingHook{
    //从钩子配置调用
    公共函数运行($params=array()){
    需要一次(BASEPATH.database/DB.php');
    $db=db();//获取DAO实例
    //对于页面浏览日志,路由信息总是很有用的
    $RTR=load_类(“路由器”、“核心”);
    $RTR->_set_routing();
    //路由器也在其中加载Uri和配置类,因此以下两个实例可能也很有趣:
    //$RTR->uri
    //$RTR->config
    //加载一些与CodeIgniter无关的有用库
    $user\u agent\u detector=load\u类('UserAgentDetector','libraries','';
    //做些日志记录
    $db->insert('page\u view\u log',array('class'=>$RTR->fetch\u class(),'method'=>$RTR->fetch\u method(),/*…*/);
    } 
    }
    
    我可能应该提到,我从来没有在生产中使用过类似的东西,而且存在着传递函数性的风险,函数性可能会随着版本的变化而变化。如果您可以不接触钩子中的Codeigniter类,那么就这样做吧


    使用for database access,加载数据库配置,无需接触任何与codeigniter相关的类即可完成。

    如果周末没有得到回答,那么我将编写一些测试用例,深入研究CI源代码,并反馈这是一个完美的答案,谢谢!我担心我将不得不以如此低的速度截获它级别,感谢您的确认!我可能会听从您的建议,避免使用任何CI类作为良好的衡量标准。此外,您为我提供了一个挖掘源代码的良好起点-这也是我非常感谢的!