【发布时间】:2010-01-19 08:44:11
【问题描述】:
我有一个内存使用溢出问题,我需要扫描我的所有脚本。
我的问题是如何在 php 中显示正在运行的 mysql 查询列表?
【问题讨论】:
标签: php mysql memory memory-management
我有一个内存使用溢出问题,我需要扫描我的所有脚本。
我的问题是如何在 php 中显示正在运行的 mysql 查询列表?
【问题讨论】:
标签: php mysql memory memory-management
如果问题出在 MySQL 网站上,这可能会有很大帮助:
mysql_query('show processlist');
它应该返回所有等待处理的查询。我通常直接从 mysql 控制台使用它,我不必格式化输出。
【讨论】:
您可以重命名原始 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;
}
【讨论】:
除非您正在运行一个具有大量流量的网站,否则运行/排队的查询的任何快照都不太可能具有代表性。在将查询与生成它的脚本相关联方面也存在问题。
我建议检测您自己的代码 - 使用自动前置定义围绕 mysql_query() 的包装器,然后您可以实现自己的日志记录:
然后对您的源代码进行递归搜索和替换,以使用您的包装函数替换对mysql_query() 的调用。
【讨论】:
我建议您连接到您的数据库服务器并运行show full processlist; 这将显示所有活动查询,您可以从那里进行调试。此外,在您的项目中添加一些工具来记录慢速查询将是有益的。
【讨论】:
在任何给定时间只有一个查询在运行,因为这就是 PHP 的工作方式,它不会做异步的事情。除非您使用某种 3rd 方库来做不同的事情。
*编辑:似乎有可能,也许看看:Asynchronous PHP calls?。但是,当您让 PHP 异步运行时,仍然无法查看正在运行的查询数量。也许您可以在运行代码时尝试检查一些 mysql 统计信息。
【讨论】: