如何确定哪些PHP代码打开未关闭的MySQL连接

时间:2009-10-29 13:17:43

标签: php mysql linux performance xdebug

我们有一个应用程序,它由几个现成的PHP应用程序(ExpressionEngine和XCart)以及我们自己的自定义代码组成。

我没有进行实际分析,所以我不确切知道它是如何确定的,但是听到太多的MySQL连接未被封闭并不感到惊讶(我并不感到惊讶,因为我看到了大量的内存泄漏在我们的开发服务器上,在一两天的时间内,从初始启动时的100MB开始,整个ram的gig被消耗掉了,而且很少被缓存了。

那么,我们如何确定哪些PHP代码是罪魁祸首?我之前有过使用XDebug的经验,并建议当我们使我们独立的分段环境相当稳定时,我们在开发人员上改进​​XDebug并使用它来进行一些分析。这是否合理,和/或其他人是否有更具体和/或额外的建议?

6 个答案:

答案 0 :(得分:3)

您可以使用

 SHOW PROCESSLIST  

用于查看正在运行的进程的SQL命令。这将告诉您每个进程正在使用的用户名,主机,数据库等。这应该让你知道发生了什么,特别是如果你有许多数据库被访问。

更多信息:http://codeinthehole.com/archives/2-Monitoring-MySQL-processes.html

答案 1 :(得分:2)

这不应该由php代码引起,因为mysql连接应该自动关闭。

cf:http://www.php.net/manual/function.mysql-connect.php

  

将关闭指向服务器的链接   一旦执行脚本   结束,除非它早先关闭   显式调用mysql_close()。

一些建议:

  • 您的开发人员在技术上是否可以直接访问您的生产mysql服务器?如果是,那么他们可能只是让他们的Mysql管理器打开:)
  • 你有一些日常批处理吗?如果是的话,也许内存中有一些zombi进程

答案 2 :(得分:1)

当页面结束时,PHP会自动关闭所有mysql连接。 PHP Web应用程序有太多未关闭的mysql连接的唯一原因是:1)您正在使用连接池,或者2)mysql服务器或连接器中存在错误。

但是如果您真的想查看代码以找到它的连接位置,请参阅http://xdebug.org/docs/profiler

答案 3 :(得分:1)

正如其他人所说,PHP终止通过mysql_connect或msqli / PDO等效创建的MySQL连接。

但是,您可以使用mysql_pconnect创建持久连接。它将寻找现有的连接打开并使用它们;如果找不到,就会开一个新的。如果您一次收到大量请求,可能会导致大量连接打开并保持打开状态。

您可以降低最大连接数,或降低持久连接的超时。有关详细信息,请参阅man page底部的评论。

答案 4 :(得分:1)

我曾经运行一个脚本来轮询SHOW STATUS以获取线程数,我注意到使用mysql_pconnect总是鼓励大量的线程。我发现这非常令人不安,因为我无法判断我的连接速率何时实际下降。所以我确保集中调用mysql_connect()的所有地方并消除mysql_pconnect()。

我接下来要做的就是查看连接超时并将其调整为30秒以上,因为。所以我用

调整了my.cnf

连接超时= 30

所以我实际上可以看到连接数量下降。要确定需要打开的连接数取决于您运行的apache worker的数量乘以它们各自将打开的数据库连接数。

我开始做的另一件事是在我的查询中添加一个注释,以便在SHOW PROCESSLIST或mytop中发现它们,我会在结果中添加一个注释列,如:

$q = "SELECT '".__FILE__.'.'.__LINE__."' as _info, * FROM table ...";

这会显示我查看mytop时发出查询的文件,并且它没有像使用

那样阻止MySQL查询缓存
/* __FILE__.'.'.__LINE__ */ 

在我的查询开始时。

答案 5 :(得分:0)

我想我可以做的另外几件事,关于一般的内存问题,特别是对MySQL,特别是在我们自己的自定义代码的上下文中,将包含我们的代码调用一个或者其他以下PHP内置函数:

memory_get_usage

memory_get_peak_usage

特别是因为我目前正在从一些自定义代码进行日志记录,所以我可以记录内存使用情况