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类作为良好的衡量标准。此外,您为我提供了一个挖掘源代码的良好起点-这也是我非常感谢的!