gpt4 book ai didi

php - CodeIgniter(预 Controller ) Hook 和缓存

转载 作者:可可西里 更新时间:2023-11-01 13:45:33 27 4
gpt4 key购买 nike

总结:

预 Controller Hook 是否在缓存期间执行?是否有任何 Hook 点可以执行? (系统前?)

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


详细版:

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

有问题的项目是一个自定义构建的 CMS - 由于更新之间的间隔延长我使用缓存来帮助加快加载时间;这不是必需的,但它是优先的。对于大部分静态站点来说,这似乎是一个很好的解决方案;尤其是动态内容主要在客户端提供的地方 - 即 AJAX 请求。

提议的功能主要涉及一个预 Controller Hook ,它在将方法转储到数据库之前通过库(例如用户代理库)访问方法。从这里可以轮询,通过 JSON 输出并在由 jQuery flot 插件之类的东西显示之前进行操作。

我已阅读关于 Web Page Caching 的文档以及 documentation regarding hooks .不幸的是,目前还不清楚使用缓存是否会完全绕过钩子(Hook)。

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

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

最佳答案

简而言之:

  • 预 Controller Hook 是否在缓存期间执行? 没有
  • 是否有任何 Hook 点可以执行? pre_system 执行。

如果缓存开始于 system/core/CodeIgniter.php:189 , 唯一有机会运行的钩子(Hook)是 pre_system (system/core/CodeIgniter:124) .

不幸的是,此时您没有获得 codeigniter 的很多功能,没有 get_instance() 并且没有它,大多数核心库也不会加载。如果您愿意,可以查看 system/core/Common.php 中定义的函数。这几乎就是你所拥有的。

如果您真的想使用内置类来完成这项工作,您可以像这样努力争取数据库对象和其他核心内容:

  1. 您必须手动获取包含在BASEPATH.'database/DB.php' 中的文件。幸运的是,在加载程序类中,它加载了require_once。所以它不会在缓存未命中时破坏页面。
  2. 一旦加载了Database 库,调用DB() 实例化通常的$this->db 对象。 .如果没有参数,它将像往常一样从配置文件加载默认数据库。
  3. 此时您可以从pre_system Hook 编写查询,并且由于 Hook 可以是对象,因此您可以将每个日志记录代码移动到 Hook 的对象中。如果您需要其他库,您可以使用 load_class() 获取它们的实例。函数(如果您不加载内置类,请不要忘记将第三个 prefix 参数设置为空字符串)。

最后你应该是这样结束的(想象中的代码):

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(), /*...*/);
}
}

我可能应该提一下,我从来没有在生产中使用过这样的东西,并且存在依赖可能因版本而异的功能的风险。如果您可以在不触及钩子(Hook)中的 Codeigniter 类的情况下使用它。

使用 PDO对于数据库访问,使用 get_config() 加载数据库配置, 你可以在不接触任何 codeigniter 相关类的情况下获得通过。

关于php - CodeIgniter(预 Controller ) Hook 和缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13771508/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com