【问题标题】:"MySQL server has gone away" after a few minutes几分钟后“MySQL 服务器已消失”
【发布时间】:2012-07-11 01:12:50
【问题描述】:

我在查询中有 2 个表,用于显示/通过电子邮件发送已保存的用户搜索信息:用户和愿望清单。

搜索信息包含书名等。

我有一个第一个查询,旨在将所有在愿望清单表中有记录的用户放入一个数组中。

然后使用 foreach 循环,通过第二个查询,获取每本书的标题并在各个站点上运行搜索,并将该信息保存到屏幕或电子邮件中。

第一次运行大约需要 3 分钟来组装第一个用户的信息,然而,在显示此信息后,我看到了可怕的“MySQL 服务器已消失”。

根据http://dev.mysql.com/doc/refman/5.0/en/gone-away.html - 这不应该这么快发生。

第二个查询的代码很简单:

SELECT * FROM wishlist WHERE uid = " . $sendtouser . " ORDER BY wishid

为该用户编译信息后,我有以下关闭循环并结束连接。

} while ($row_rsWishDetails = mysql_fetch_assoc($rsWishDetails));
mysql_free_result($rsWishDetails);

我尝试了一些我在网上找到的其他建议,包括:

ini_set('max_execution_time', 22222);
ini_set('mysql.connect_timeout', 500);
ini_set('default_socket_timeout', 600);

但没有什么能解决问题。

有什么想法吗?

非常感谢。

【问题讨论】:

    标签: php mysql disconnect


    【解决方案1】:

    对于长时间运行的脚本,您需要在运行任何查询之前确保连接仍然打开。最好的方法是在查询之前使用mysql_ping() 之类的内容。

    另外,mysql 相当陈旧且效率低下。你应该尝试升级到mysqli。

    【讨论】:

    • 感谢您的回复 :) 但是 5 分钟真的是“长时间运行”吗?事实上,不是查询本身需要很长时间,而是查询必须在从网络编译信息时暂停,然后再继续。我想在每个用户的末尾添加一个“sleep(3)”,但它没有做任何事情。
    • 很遗憾我们租用空间的服务器没有安装mysqli。
    • 这给我留下了 ping。我什么时候运行这个?就在查询之前?这是否意味着在每个循环之前,都会再次运行 ping?还是在查询开始之前只运行一次 ping?
    • 5 分钟运行时间相当长,尤其是在未使用连接的情况下。关闭未使用或休眠的 MySQL 连接通常是一件好事,尤其是在高流量 MySQL 服务器上。另外,如果你觉得我的答案是正确的,如果你能把它标记为这样就很棒了!
    【解决方案2】:

    你需要测试你能收到多少数据。

    您的数据库机器是否旧或您的结果行数是 1000000000000000000000+, 您需要通过分页来修复查询:限制、光标等...

    这不是您问题的直接解决方案。

    首先,检查您的行数

    SELECT COUNT(*) FROM wishlist WHERE uid = " . $sendtouser . "
    
    • 不需要 ORDER BY。

    检查删除 ORDER BY 短语,如果确定,使用 PHP 代码重新排列。有时它可能会有所帮助。

    和...

    ini_set('max_execution_time', 22222);
    

    如您所知,这是客户端(PHP)配置,如果不允许使用mysql-server,则无用。

    【讨论】:

    • 我可以告诉你行数。目前只有 3 个用户。并且愿望清单表中记录最多的用户的行数小于 15。
    • @Aethon 哎呀,至少,这不是查询问题,而是网络问题。你能在运行 PHP 的机器上检查这个命令吗? telnet mysql_server_host_ip 3306 如果时间长,是网络问题。还是...?
    • 感谢您的评论,但我认为等待从网络获取结果的时间是导致问题的原因。我想知道 wait_timeout 是否有帮助?
    • @Aethon 是的,我再次检查了你的问题,它的连接仍然存在问题。 '克里斯亨利'给了你一个解决方案。 mysql 将关闭 php 连接,因为 php 没有操作(附加查询)并占用了服务器连接。所以 ping() 对于持久连接非常有用。和检查心跳一样。它会运作良好。但是,如果您不想使用 ping,请检查选项 'mysqli.reconnect' 或检查 mysql-server 配置以更改客户端持续时间(但是,您无法访问租用机器),您解决了问题。祝你好运。
    猜你喜欢
    • 2018-12-07
    • 2015-09-03
    • 1970-01-01
    • 1970-01-01
    • 2012-05-25
    • 2011-06-07
    • 2010-12-20
    • 2013-06-13
    相关资源
    最近更新 更多