2009-05-23 127 views
4

我想知道当我们在模型上使用find方法时,是否有办法记录CakePHP中的mysql查询,我知道rails数据库查询,Cake做的也一样,if所以我如何启用它或使用它?CakePHP中的MySQL查询日志记录

希夫

回答

1

假设你是一个类Unix操作系统,最好的办法实际上尾MySQL日志本身。
你可能会从中学到一些有趣的东西。

日志在Ubuntu从仓库

tail -f /var/log/mysql/mysql.log 

正如下面提到的安装时,这是一个巨大的性能杀手(当然,所有日志对性能有一定的影响)。因此,请确保仅在您的开发/质量保证机器上使用它,并且只在生产机器上短时间使用它。

+0

没有办法从CakePHP的记录它,就像我们使用$ this-> log – Shiv 2009-05-23 22:25:58

+1

默认情况下,mysql.log被禁用,因为它是一个巨大的性能杀手,你需要从my.cnf中禁用它,并且只在dev环境中这样做! – duckyflip 2009-05-24 12:22:51

6

This page有关于如何让Cake以与轨道相同的方式记录查询的说明。

1

CakePHP 1.3使用sql_dump这个元素。
您可以直接使用时Configure::read('debug')设置为2的元素:

echo $this->element('sql_dump'); 

或者把它的代码直接,如果你需要做别的事情与它(如回声它从一个ShellTask​​)

$sources = ConnectionManager::sourceList(); 

$logs = array(); 
foreach ($sources as $source): 
    $db =& ConnectionManager::getDataSource($source); 
    if (!$db->isInterfaceSupported('getLog')): 
     continue; 
    endif; 
    $logs[$source] = $db->getLog(); 
endforeach; 

回声如:

print_r($logs) 
1

这是我使用(把它放在元素文件夹,然后在您的布局)

<?php 
    ob_start(); 
    echo $this->element('sql_dump'); 
    $out = ob_get_contents(); 
    ob_end_clean(); 
    CakeLog::write('mysql' , $out); 
?> 

那么你会发现mysql.log文件中TMP.logs.DS.mysql.log

4

一个非常简单的方法来记录所执行的所有查询:

蛋糕\库\型号\数据源\ DBO \ dbo_mysql.php

找到_execute功能:

function _execute($sql) { 
     return mysql_query($sql, $this->connection); 
} 

添加行“$ this-> log($ sql);“before”return mysql_query($ sql,$ this-> connection);

function _execute($sql) { 
    $this->log($sql); 
    return mysql_query($sql, $this->connection); 
} 

这就是它!!!!!你的所有SQL查询得到记录。确保日志文件的配置是否正确,并有足够的权限,享受