【问题标题】:PHP Mysql PDO: General error: 2006 MySQL server has gone awayPHP Mysql PDO:一般错误:2006 MySQL 服务器已消失
【发布时间】:2017-04-29 05:14:21
【问题描述】:

我目前正在运行一个自定义 php 脚本,该脚本在我的本地主机上运行时工作正常,但是在共享主机上运行时,我收到以下错误:

致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[HY000]:一般错误:2006

MySQL server has away' in ...... 205 堆栈跟踪:

0 ........ PDO->prepare('SELECT * FROM o...') #1 {main} throw in .......... 第 205 行

(我已将文件路径替换为.......)

我尝试过的事情:

  1. 添加PDO::ATTR_TIMEOUT => "999999999999999999999",以延长任何超时时间。

  2. 检查了max_allowed_packet(我找到的每个答案都说这是原因) 我的本地计算机当前设置为 1048576 (1mb),但我的主机当前设置为 268435456 (268mb)

如果我的本地计算机为 268mb 而我的主机为 1mb,我会理解,但这并不能说明问题的原因,因为事实并非如此。

我确实尝试在我的主机上增加它,但由于它是共享的,我没有更改这个全局变量的权限。

关于我可以尝试的任何其他想法?

仅供参考,这是脚本:

//MYSQL PREPARE STATEMENTS
//check to see if a product is in database
$mysql['productcheck'] = $mysql['pdo']->prepare('SELECT * FROM oc_product WHERE sku = ?');
$newproductcount=0;
$x = 0;
while(($maintable[$x]['status']=="active") || ($maintable[$x]['status']=="new") || ($maintable[$x]['status']=="discontinued") || ($maintable[$x]['status']=="archive")) {
    if(($maintable[$x]['status']=="active") || ($maintable[$x]['status']=="new")){
        //check to see if product exsists
        $params[1]=$maintable[$x]['euid'];
        $mysql['productcheck']->execute([$params[1]]);
        if($mysql['productcheck']->rowCount()==0){
            //PRODUCT DOESN'T EXSIST
            echo "Product doesnt exsists!";
            $newproductcount++;
        }
    }
$x++;
}

【问题讨论】:

    标签: php mysql pdo


    【解决方案1】:

    MySQL 服务器已消失错误的其他一些常见原因是:

    • 您(或数据库管理员)已使用 KILL 语句或 mysqladmin kill 命令终止了正在运行的线程。

    • 您尝试在关闭与服务器的连接后运行查询。这表明应用程序中存在需要纠正的逻辑错误。

    • 在不同主机上运行的客户端应用程序没有必要的权限从该主机连接到 MySQL 服务器。

    • 客户端的 TCP/IP 连接超时。如果您一直在使用以下命令,则可能会发生这种情况:mysql_options(..., MYSQL_OPT_READ_TIMEOUT,...) 或 mysql_options(..., MYSQL_OPT_WRITE_TIMEOUT,...)。在这种情况下,增加超时时间可能有助于解决问题。

    • 遇到服务器端超时,客户端自动重连被禁用(MYSQL结构中重连标志等于0)。

    • 您正在使用 Windows 客户端,并且服务器在发出命令之前已断开连接(可能是因为 wait_timeout 已过期)。

    • Windows 上的问题是,在某些情况下,MySQL 在写入到服务器的 TCP/IP 连接时不会从操作系统收到错误,而是在尝试从连接中读取答案时收到错误.

    • 解决方案是,如果自上次查询以来已经有很长时间(这是连接器/ODBC 所做的),则在连接上执行 mysql_ping(),或者将 mysqld 服务器上的 wait_timeout 设置得如此之高实际上它永远不会超时。

    • 如果您向服务器发送不正确或太大的查询,也可能会出现这些错误。如果 mysqld 收到一个太大或乱序的数据包,它会假设客户端出现问题并关闭连接。如果您需要大查询(例如,如果您使用大 BLOB 列),您可以通过设置服务器的 max_allowed_pa​​cket 变量来增加查询限制,该变量的默认值为 4MB。您可能还需要增加客户端的最大数据包大小。有关设置数据包大小的更多信息,请参见第 B.5.2.10 节“数据包太大”。

    • 插入大量行的 INSERT 或 REPLACE 语句也可能导致此类错误。无论要插入的行数如何,这些语句中的任何一个都会向服务器发送单个请求;因此,您通常可以通过减少每次 INSERT 或 REPLACE 发送的行数来避免错误。

    • 如果您的客户端版本早于 4.0.8 而您的服务器版本为 4.0.8 或更高版本,或者相反,您发送 16MB 或更大的数据包也会导致连接丢失。

    • 如果主机名查找失败(例如,如果您的服务器或网络所依赖的 DNS 服务器出现故障),也可能会看到此错误。这是因为 MySQL 依赖于主机系统进行名称解析,但无法知道它是否在工作 - 从 MySQL 的角度来看,该问题与任何其他网络超时都无法区分。

    • 如果使用 --skip-networking 选项启动 MySQL,您可能还会看到 MySQL server has gone away 错误。

    • 如果 MySQL 端口(默认 3306)被防火墙阻止,则会出现另一个可能导致此错误的网络问题,从而完全阻止与 MySQL 服务器的任何连接。

    • 对于派生子进程的应用程序,您也可能会遇到此错误,所有这些子进程都尝试使用与 MySQL 服务器的相同连接。这可以通过为每个子进程使用单独的连接来避免。

    • 您遇到了服务器在执行查询时死机的错误。

    查看此链接:Gone Away

    【讨论】:

    • 同样的问题 - 在我的情况下,问题是我试图在关闭与服务器的连接后运行查询 - 即 wait_timeoutconnect_timeout 被触发(默认为 30 秒)。应用程序中有明显的逻辑错误。
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 2012-06-28
    • 2011-12-18
    • 2012-05-15
    相关资源
    最近更新 更多