【问题标题】:PHP PDO query waiting for a request on a different MySQL connection, returns "Mysql Server Has Gone Away"PHP PDO 查询等待不同 MySQL 连接上的请求,返回“Mysql Server Has Gone Away”
【发布时间】:2011-09-13 15:20:52
【问题描述】:

我的网站有问题,在不同部分使用两种类型的连接连接到 MySQL 数据库:一些 PDO,一些 mysql_connect()。

网站的第一部分是使用非常经典的 'mysql_query()' PHP 函数请求 MySQL。这部分对地理数据进行了一些繁重的查询。其中一些请求(已经优化)需要很长时间。

该网站的另一部分是较新的,并且是通过 PDO 连接使用 Doctrine 制作的。

问题是,当一个大进程在一个浏览器页面中运行时(可能需要大约 1 分钟来处理并返回页面),如果用户打开另一个页面,PDO 连接处于睡眠模式,并保持从加载整个页面。 60 秒后(mysql 的 wait_timeout)连接被终止,PDO 得到一个异常“The MySQL Server has gone away”。

奇怪的是,只有经典的 mysql_connect() 和 mysql_query() 的其他页面可以并行运行而没有问题,只有 PDO 查询被阻止并最终死亡。

任何意见将不胜感激。

【问题讨论】:

  • MySQL 有每个连接超时。由于 PDO 和 mysql_*() 是两个不同的环境,很可能它们配置了不同的超时时间。
  • 我猜可能是 Table Lock 造成的。
  • 我只对这些请求进行读取(仅 SELECT),而 PDO 完全在另一个数据库上工作。此外,超时不是问题,问题是 PDO 根本无法与其他查询并行运行。
  • 可能有多种原因。如果您可以记录查询会更好。另外,在 PDO 尝试运行查询时尝试在 mysql 中“显示进程列表”。另外,您可以尝试直接从 mysql 客户端运行 PDO 查询吗?它会告诉你查询是否真的需要很长时间。
  • @Cadrach - 您是否使用套接字进行两个连接?还是通过 http 端口?

标签: php mysql pdo


【解决方案1】:

关闭这个问题,它实际上与php会话在写入时被阻止,阻止其他进程运行有关。 session_write_close() 解决了它。

【讨论】:

  • 请记得在时间允许的情况下回来接受这个答案
【解决方案2】:

连接关闭的原因有多种。

参考: https://dev.mysql.com/doc/refman/5.0/en/gone-away.html

我在使用 PDO 时也遇到了类似的问题,如果主机管理员在睡眠超过一分钟时会终止连接。因此我想出了我自己的类来包装 PDO 类。这将检测连接是否已关闭,并在查询执行时尝试重新连接。

在下面回答

PDO: MySQL server has gone away

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-13
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2011-12-11
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多