【问题标题】:Zend Framework app not closing mysql connections properlyZend Framework 应用程序未正确关闭 mysql 连接
【发布时间】:2010-12-12 11:47:24
【问题描述】:

我在使用 Zend_Db 的 PDO 适配器来管理我的数据库连接时遇到了一个奇怪的问题。突然之间,我的 MySQL 服务器上的连接数不断受到限制。

无论出于何种原因,每三四个小时左右我就会收到此错误,而 Apache 会在每个 HTTP 请求上报错:

PHP 致命错误:未捕获异常 'Zend_Db_Adapter_Exception' 并带有消息 'SQLSTATE[00000] [1129] 主机 'my.internal.mysql.server.DNS.here' 由于许多连接错误而被阻止;在

中使用 'mysqladmin flush-hosts'' 解除阻止

奇怪的是,我没有更改任何代码,而且流量实际上比过去有所下降,所以我知道我的应用程序不应该产生更多并发连接。最奇怪的是,我在近一周内没有更改任何主要应用程序文件的代码,此后一切都顺利运行。

重启 mysql 服务或使用 mysqladmin flush-hosts 刷新连接确实可以解决问题,我确信增加 my.cnf 中的最大并发连接数也有助于缓解其中一些问题,但似乎有一个应用程序本身创建太多连接的核心问题。

关于如何深入了解和关联导致挂起连接的代码段有什么想法吗?在外部,Web 应用程序的所有不同页面都可以正常加载且速度很快。

【问题讨论】:

  • 我很难决定是在 ServerFault 上还是在此处发布此内容,但我决定从这里开始,因为这似乎是一个应用程序问题

标签: php mysql zend-framework


【解决方案1】:

您是否尝试手动关闭连接?这似乎是一个特定的问题。

$db->closeConnection();

参考: http://framework.zend.com/manual/en/zend.db.adapter.html#zend.db.adapter.closing

15.1.8。关闭连接

【讨论】:

  • 我不应该这样做 - 这些连接应该在它们运行后自行关闭。
  • 嗯,不,显然不是——但关键是要确定原因,而不是贴上创可贴。
  • 我在使用 Zend_Test 和 DB 连接的大型测试套件时遇到了问题,在拆卸过程中手动关闭连接有助于解决问题。谢谢。
【解决方案2】:

不要认为它与正确关闭连接有关。 http://dev.mysql.com/doc/refman/5.0/en/blocked-host.html 说这是网络层的问题。

  • 如果数据库位于其他计算机上,请检查(电缆、交换机、防火墙)之间的网络连接问题
  • 如果数据库在同一台机器上,请尝试使用套接字连接,而不是 TCP。

【讨论】:

  • 您可能正在做某事。这是两个不同的 Amazon EC2 实例,我通过内部 DNS 进行连接。我不确定会存在哪些网络问题(如果有的话)。
【解决方案3】:

首先我要问:你们有新的核心转储吗? (检查 apache 错误日志)。

第二:根据我的严峻经验,与数据库的连接过多通常意味着您有太多的 apache 进程没有正常死亡。这通常是由一些长时间运行的进程、内存锁定等引起的。尝试strace 一些 apache 进程,看看它们是否挂起或无限循环。

除非您的流量显着增加,否则您不应该遭受连接过多的问题

【讨论】:

    【解决方案4】:

    我们的 Zend 应用程序也打开了相当多的连接。他们往往会突然出现,但我们从来没有弄清楚发生了什么。我们通过将max_connections 设置为高(无论如何我们出于其他原因需要)并将wait_timeout 减少到两个小时来解决这个问题。我们本可以用低得多的超时时间侥幸逃脱,但一旦我们不再看到失败,我们不想冒真正的应用程序的风险。

    【讨论】:

    • 我最终将我的 max_connections 设置为 200,但即便如此,它仍在发生。您最终将最大连接数设置为什么?
    【解决方案5】:

    我认为您的一个脚本正在运行超长查询或卡住?

    最好的解决方案是创建一个日志记录工具并使用它来了解问题的确切位置。

    Zend_Log 类应该可以帮助您编写该日志记录工具,显然您最好使用文件写入器而不是数据库写入器。由于您的问题与 DB 相关,您应该创建或修改 DB 类以发出一些日志。

    我不知道您项目的体积,但它可能会产生一些性能副作用。

    同时使用 MySQL 的long query 功能可能会给您一些提示。

    希望您能找到问题所在。

    【讨论】:

      【解决方案6】:

      不确定这对您是否有用,但此链接为您提供了对您遇到的问题的(临时)良好描述以及您可以覆盖的 --max_connect_errors 设置:

      http://developer.spikesource.com/wiki/index.php/Question:mysqladmin_host_blocked_because_of_many_connection_errors

      一位用户也回应并建议在命令行上尝试以下操作:

      > mysqladmin -u <user> -p<password> processlist
      

      这将为您提供当前 mysql 连接的列表,以了解您当前正在运行的并发连接数。同样,这些并不是每个人所说的解决方案,但希望它们能让您更接近解决连接断开的问题。

      【讨论】:

        猜你喜欢
        • 2021-04-11
        • 2014-07-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-20
        • 2018-02-14
        • 1970-01-01
        相关资源
        最近更新 更多