【发布时间】:2010-03-24 02:14:57
【问题描述】:
是否可以在 Magento 中显示所有查询字符串?我真的很想看看执行了哪些查询。
谢谢
【问题讨论】:
标签: php mysql magento debugging
是否可以在 Magento 中显示所有查询字符串?我真的很想看看执行了哪些查询。
谢谢
【问题讨论】:
标签: php mysql magento debugging
在 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';
授予读/写权限
【讨论】:
我不是 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 情况,这并不总是可能的)
【讨论】:
使用 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找到所有查询
完成调试后不要忘记再次删除这些行!
【讨论】:
查询会因您的活动而有很大差异。如果您对 MySQL 服务器有一定的控制权,请尝试打开查询日志记录:
set global general_log = on
然后您可以获取 SQL 日志以查看查询。作为一个词或警告,Magento 倾向于在每次页面加载时执行数十个查询,并为保存一个对象执行数百个查询。
谢谢, 乔
【讨论】:
$collection->printLogQuery(true);
【讨论】:
开启 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';
【讨论】: