大多数 PHP 框架使用单个连接接口 - 某种包装器 - 这使得通过该接口记录所有查询成为可能。
如果不存在,另一种方法是在 MySQL 级别启用日志记录。但对于某些人来说,可能是合法的,你也不想这样做。如果您想防止停机,您实际上可以enable query logging without restarting the MySQL server.
如果上述解决方案都不可行,您必须亲自动手 :-)
一种方法是在 PHP 代码中添加您自己的日志记录。
如果您写入文件末尾,则向文件写入新行不是性能问题。
我不确定你是如何查询数据库的,但如果你..
A) ..使用程序化 mysqli 函数
如果您使用 mysqli_query() 之类的过程 mysqli 函数来调用数据库,您可以创建自己的全局自定义函数,该函数写入日志文件,然后调用真正的函数。
一个例子:
添加新的全局函数:
function _mysqli_query($link, $query, $resultmode = MYSQLI_STORE_RESULT )
{
// write new line to end of log-file
file_put_contents('queries.log', $query . "\n", FILE_APPEND);
// call real mysqli_query
return mysqli_query($link, $query, $resultmode);
}
在项目范围内搜索并替换 mysqli_query( 为 _mysqli_query(.
然后是这样的一行:
$result = mysqli_query($conn, 'select * from users');
搜索和替换后的样子:
$result = _mysqli_query($conn, 'select * from users');
B) ..使用 mysqli 类(面向对象的风格)
如果您通过实例化 mysqli 类来使用面向对象的样式,然后调用查询方法,例如$mysqli->query("select * from users") 一种方法可以是创建您自己的数据库类,该类扩展 mysqli 类,并在特定方法(例如查询函数)中添加上例中的日志记录。
在 O'Reilly 强烈推荐的书“高性能 MySQL”中,他们通过代码示例介绍了如何执行此操作并添加额外的调试信息(时间等)。部分页面为accessible at google books。
一般情况
我会考虑利用这个机会来更好地重构一些代码库。
如果您编写了自动化测试,这是确保重构不会破坏任何东西的好方法。
如果您不练习自动化测试,则必须手动测试整个应用程序。
您说您担心您的性能问题来自重复的数据库查询,这很可能是这种情况。
在大多数情况下,我发现它缺少索引或需要重写单个查询。
如果您认为这可能是导致性能问题的其他原因,那么 MySQL 中的性能模式可以帮助您调试这些东西。