我们有一个应用程序,包括几个架子PHP applications(ExpressionEngine和XCart)以及我们自己的定义的代码。

我没有做到实际的分析,所以我不确切知道它是如何确定,但我不惊讶地听到,太多的MySQL连接被封闭(我并不感到惊讶,因为我已经看到重大的存在泄漏我们的开发服务器,在那里超过一天或两天,开始从100mb在初始启动,在整个演出的ram得到消耗,并且极少是缓存).

因此,我们怎么去确定精确PHP码是罪魁祸首?我有先前经验与XDebug,并建议,当我们得到我们的独立、过渡环境中相当稳定,我们的改造XDebug在开发和使用,以做一些分析。这是合理的,并/或不任何其他人具有更特定的和/或额外的建议?

有帮助吗?

解决方案

您可以使用

 SHOW PROCESSLIST  

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

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

其他提示

这不应该引起的php code因为mysql连接都应该自动关闭。

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

链接的服务器将被关闭 尽快执行的脚本 结束,除非它是早些时候关闭的 explicitly calling mysql_close().

一些建议:

  • 没有你的开发人员,有技术上的一个直接进入你的生产mysql server?如果是的话,那么它们可能只是离开他们的Mysql管理开放时间:)
  • 你有一些每日批处理过程?如果是的话,也许这有一些僵尸过程中存储器

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

但如果您真的想查看代码以查找其连接位置,请参阅 http:// xdebug。组织/文档/分析器

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

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

您可以降低最大连接数,或降低持久连接的超时。有关更多信息,请参阅手册页底部的评论的信息。

我曾经运行一个脚本来轮询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__ */ 

在我的查询开始时。

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

memory_get_usage

memory_get_peak_usage

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top