我们有一个应用程序,它由几个现成的PHP应用程序(ExpressionEngine和XCart)以及我们自己的自定义代码组成。
我没有进行实际分析,所以我不确切知道它是如何确定的,但是听到太多的MySQL连接未被封闭并不感到惊讶(我并不感到惊讶,因为我看到了大量的内存泄漏在我们的开发服务器上,在一两天的时间内,从初始启动时的100MB开始,整个ram的gig被消耗掉了,而且很少被缓存了。
那么,我们如何确定哪些PHP代码是罪魁祸首?我之前有过使用XDebug的经验,并建议当我们使我们独立的分段环境相当稳定时,我们在开发人员上改进XDebug并使用它来进行一些分析。这是否合理,和/或其他人是否有更具体和/或额外的建议?
答案 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()。
一些建议:
答案 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内置函数:
特别是因为我目前正在从一些自定义代码进行日志记录,所以我可以记录内存使用情况