【问题标题】:CakePHP track consuming resources queryCakePHP 跟踪消耗资源查询
【发布时间】:2016-01-14 12:57:13
【问题描述】:

我需要跟踪在我的 CakePHP 2.5.2 应用程序中执行此查询的位置(由 DebugKit 报告):

SELECT COUNT(*) AS count FROM sometable WHERE status = 1

我找到了一个引用表的模型,可能在其他地方也引用了它。

除了查找模型或运行所有可能的 PHP 脚本来查找此查询在我的 CakePHP 应用程序中的来源之外,还有更好的方法吗?

【问题讨论】:

  • 这可能是 cakephp 内部运行的查询。也许您有类似的查询,但没有计数。
  • 一定是内部查询,我看到的所有模型和控制器都不会触发这个查询。我想发现它发生在哪里,并更改为性能更高的查询。

标签: sql cakephp logging cakephp-2.5 cakephp-2.x


【解决方案1】:

您可以扩展 Mysql 类并覆盖 logQuery(),以便它使用您选择的日志记录机制记录每个请求。

例子:

  1. 创建文件/app/Model/Datasource/MysqlLog.php 并添加以下内容:

    App::uses('Mysql', 'Model/Datasource/Database');
    
    class MysqlLog extends Mysql {    
    
        function logQuery($sql, $params = []) {
            parent::logQuery($sql);
            Debugger::log("sql[{$this->_queriesCnt}]: $sql");
        }
    }
    
  2. 通过修改 /app/Config/database.php 来指示 CakePHP 使用新类:

    public $default = array(
        'datasource' => 'Database/MysqlLog',
        'persistent' => true,
        'host' => 'localhost',
        'login' => 'my_login',
        'password' => 'my_pass',
        'database' => 'my_db',
    );
    

请求将被记录到/app/tmp/logs/debug.log

基于 Vladimir Bilyov 的帖子 Logging sql queries into file in CakePHP 2

【讨论】:

  • 我是否可以在模型中设置任何属性,以便此计数仅使用一个字段来获得更好的性能?
  • 首先你需要找出它的来源。如果它与分页有关,也许this 会有所帮助。但是,count(*) 应该比 count(field) 快。见this answer
  • 这应该是可能的,如果你应用同样的原则。但我不确定 CakePHP 是否完全支持 Oracle。看到这个问题 - stackoverflow.com/questions/14376743/…
猜你喜欢
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多