【问题标题】:How do I print all the queries in Magento?如何打印 Magento 中的所有查询?
【发布时间】:2010-03-24 02:14:57
【问题描述】:

是否可以在 Magento 中显示所有查询字符串?我真的很想看看执行了哪些查询。

谢谢

【问题讨论】:

    标签: php mysql magento debugging


    【解决方案1】:

    在 Varien_Db_Adapter_Pdo_Mysql 中

    Magento 1.4 : lib/varien/Db/Adapter/Pdo/Mysql.php
    

    设置

    protected $_debug               = true;
    protected $_logAllQueries       = true;
    

    并且(如果还没有的话)创建在

    中定义的文件夹
    protected $_debugFile           = 'var/debug/sql.txt';
    

    授予读/写权限

    【讨论】:

    • 不幸的是,这不会记录所有查询,因为该类及其 query() 方法并非无处不在。
    【解决方案2】:

    我不是 100% 确定这会捕获 每个 查询,但大多数都通过查询方法 Zend_Db_Adapter_Abstract query 中的方法运行

    lib/Zend/Db/Adapter/Abstract.php
    

    考虑到这一点,您可以临时添加一些调试语句(为了安全起见,添加到您在 app/code/local/Mage 中制作的副本中)

    public function query($sql, $bind = array())
    {
        // connect to the database if needed
        $this->_connect();
    
        // is the $sql a Zend_Db_Select object?
        if ($sql instanceof Zend_Db_Select) {
            if (empty($bind)) {
                $bind = $sql->getBind();
            }
    
            $sql = $sql->assemble();
        }
        echo "{$sql}\n<br />\n";
        var_dump($bind);
    

    如果您需要全部捕获它们,最好在 MySQL 级别执行此操作(根据您的主机/IT 情况,这并不总是可能的)

    【讨论】:

    • 这个函数怎么调用? Zend_Db_Select 对象何时可用?什么是绑定?
    【解决方案3】:

    使用 local.xml 中的以下节点激活 Zend SQL Profiler

    <resources>
     <default_setup>
      <connection>
       <profiler>1</profiler>
    

    然后您可以在代码中的某处访问分析器并检索有关所有已执行查询的大量信息:

    $profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();
    

    简单地输出所有查询:

    print_r($profiler->getQueryProfiles());
    

    您可以在index.php 的末尾添加这两行,以在每页底部查看所有查询。请注意,这会破坏返回 JSON 响应的 AJAX 请求,因此您可以考虑使用以下代码记录查询而不是打印它们(同样,将其添加到 index.php 的末尾):

    $profiler = Mage::getSingleton('core/resource')->getConnection('core_write')->getProfiler();
    Mage::log(print_r($profiler->getQueryProfiles(), true), null, 'queries.log', true);
    

    然后你会在var/log/queries.log找到所有查询

    完成调试后不要忘记再次删除这些行!

    【讨论】:

      【解决方案4】:

      查询会因您的活动而有很大差异。如果您对 MySQL 服务器有一定的控制权,请尝试打开查询日志记录:

      set global general_log = on
      

      然后您可以获取 SQL 日志以查看查询。作为一个词或警告,Magento 倾向于在每次页面加载时执行数十个查询,并为保存一个对象执行数百个查询。

      谢谢, 乔

      【讨论】:

        【解决方案5】:
        $collection->printLogQuery(true);
        

        【讨论】:

          【解决方案6】:

          开启 MySQL 日志记录肯定会记录所有查询事务。这是打开日志记录的方法。打开日志记录以记录到文件。将以下内容放在 my.cnf 文件或 my.ini 文件中(如果在 Windows 上),然后重新启动 MySQL。

          log = /path/to/your/logfile.log
          

          然后,如果您想登录到表 mysql.general_log,请运行以下查询:

          SET GLOBAL log_output = 'TABLE';
          SET GLOBAL general_log = 'ON';
          

          如果你想登录到文件,运行这些:

          SET GLOBAL log_output = "FILE"; 
          SET GLOBAL general_log = 'ON';
          

          【讨论】:

            猜你喜欢
            • 2011-04-19
            • 1970-01-01
            • 2016-05-01
            • 1970-01-01
            • 2019-09-25
            • 1970-01-01
            • 1970-01-01
            • 2019-07-15
            • 2019-04-18
            相关资源
            最近更新 更多