如何在PHP中显示正在运行的MySQL查询

4

我有一个内存使用过载的问题,需要扫描所有的脚本。

我的问题是如何在php中显示正在运行的mysql查询列表?

5个回答

4
如果问题出在MySQL网站上,这可能会很有帮助:
mysql_query('show processlist');

此命令应返回等待处理的所有查询。通常我直接从mysql控制台中使用,无需格式化输出。


它仅显示根据http://dev.mysql.com/doc/refman/5.1/en/show-processlist.html的进程,而不是查询数量(或其他查询信息)。 - Veger

3
你可以将原始的mysql_query函数重命名,并编写自己的函数,其中包含一些额外的日志记录/检查代码,以查看查询中出现了什么问题:
rename_function('mysql_query', 'mysql_query_original');
override_function('mysql_query', '$query', 'return mysql_query_override($query);');

function mysql_query_override($query){
    echo "Query started";         // Add some more sensible information here
    $result = mysql_query_original($query);  
    echo "Query ended";           // Add some more sensible information here
    return $result;
}

3
除非您运行的是大流量网站,否则任何查询/排队的快照都不太可能代表性。此外,在将查询与生成它的脚本相关联方面也存在问题。
我建议对自己的代码进行仪表化-使用自动预置来定义mysql_query()的包装器,然后您可以实现自己的日志记录,其中:
1. 在脚本启动之前创建日志条目(大多数日志条目在之后创建-如果编写日志的代码崩溃,这就不太方便了) 2. 记录触发查询的脚本及其本身 3. 记录之前的内存使用情况 4. 记录之后的相同事实以及所花费的时间
然后在源代码上进行递归搜索和替换,以替换对mysql_query()的调用。

1
我明白了,我通过在我的脚本中设置一些断点来找到问题,但问题出在while()语句上,用于显示我的最新故事。例如,如果我想在一页中显示5个故事,则查询次数将为60,而显示一个故事则需要13次查询。 问题是如何避免这个问题? - Farshad

0
我建议您连接到数据库服务器并运行show full processlist;,这将显示所有活动查询,您可以从那里进行调试。此外,向您的项目添加一些工具以记录慢查询将会很有益处。

-1

在任何时候只有一个查询正在运行,因为这是PHP的工作方式,它不会异步地执行操作。除非您使用某种第三方库来进行不同的处理。

*编辑:似乎是可能的,请参阅:PHP异步调用?。但是,当您让PHP异步运行时,仍然无法知道有多少查询正在运行。也许你可以尝试在运行代码时检查一些mysql统计信息。


嘿,我知道如何找到正在运行的查询数量: 简单的SQL查询语句:$con->sql_num_queries $con是我的数据库类。 - Farshad
然而,它可能只列出了所有活动查询,来自多个活动页面,而不仅仅是当前页面。或者呢?:) - Kolky
如果您考虑到我的页面包括其他文件的功能,那么SQL语句显示的查询数量就是当前正在运行的查询量。 - Farshad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接