【问题标题】:Display all SQL queries within a single PHP script execution在单个 PHP 脚本执行中显示所有 SQL 查询
【发布时间】:2020-03-20 16:53:41
【问题描述】:

在 PHP 中有一个长期存在的大型项目,在其开发过程中,不同时期涉及了许多不同的开发人员。潜在地,在错误修复期间可能存在重复数据库查询的地方。一些解决本地问题的开发人员可以编写并执行查询,返回先前获得的数据。现在在项目中存在数据库性能问题,因此有一个问题:

是否有任何工具(除了常规日志)可以让您查看在单个 PHP 脚本执行过程中进行了哪些数据库查询?

问题与项目中有很多API端点有关,仅通过阅读代码来检查它们需要很长时间(有时非常华丽)。

【问题讨论】:

  • MySQL 在进程中组织查询。你也可以激活一个 binlog。
  • 项目是否使用某种数据库包装器?
  • @thephper 不幸的是没有涉及到 db 包装器。

标签: php mysql


【解决方案1】:

大多数 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 中的性能模式可以帮助您调试这些东西。

【讨论】:

  • 我的回答对你有帮助吗@DieHardHen?
猜你喜欢
  • 2015-10-22
  • 2017-01-07
  • 2020-06-24
  • 2018-03-27
  • 2011-07-26
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多