PHP Mysql PDO:一般错误:2006 MySQL服务器已经消失

时间:2016-12-14 00:48:57

标签: php mysql pdo

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

  

致命错误:未捕获的异常'PDOException',消息为'SQLSTATE [HY000]:常规错误:2006

     

MySQL服务器已经消失了...... 205 Stack trace:

     

0 ........ PDO->准备('SELECT * FROM o ...')#1 {main}在第205行..........中抛出

(我用.......替换了文件路径)

我尝试过的事情:

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

  2. 检查max_allowed_packet(我发现的每个答案都说这是原因) 我的本地计算机目前设置为1048576(1mb),但我的托管目前设置为268435456(268mb)

  3. 我会理解,如果我的本地机器是268mb,我的主机是1mb,但这没有任何意义,这是问题的原因,因为事实并非如此。

    我确实试图在我的托管上增加它但是因为它的共享我没有权限来更改这个全局变量。

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

    FYI这是剧本:

    //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++;
    }
    

1 个答案:

答案 0 :(得分: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所做的那样),或者在mysqld服务器上设置wait_timeout这么高就要对连接执行mysql_ping()它在实践中永远不会超时。

  • 如果向服务器发送不正确或过大的查询,也可能会出现这些错误。如果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服务器已经消失。

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

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

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

点击此链接:Gone Away