我当前正在运行一个自定义 php 脚本,该脚本在我的本地主机上运行时工作正常,但是在共享主机上运行时,我收到以下错误:
致命错误:未捕获异常“PDOException”,消息为“SQLSTATE[HY000]:一般错误:2006
MySQL 服务器已经消失了......205 堆栈跟踪:
0 ........ PDO->prepare('SELECT * FROM o...') #1 {main} 在第 205 行抛出......
(我已将文件路径替换为......)
我尝试过的事情:
-
Adding PDO::ATTR_TIMEOUT => "999999999999999999999"
,延长任何超时。
-
检查了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++;
}
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 连接时不会从操作系统收到错误,而是在尝试从连接读取答案时收到错误。
解决这个问题的方法是,如果自上次查询以来已经过了很长时间(这就是 Connector/ODBC 所做的),则在连接上执行 mysql_ping() ,或者在 mysqld 服务器上设置 wait_timeout 太高,以至于实际上永远不会出现出去。
如果您向服务器发送的查询不正确或太大,您也可能会收到这些错误。如果 mysqld 收到太大或无序的数据包,它会认为客户端出现问题并关闭连接。如果您需要大型查询(例如,如果您正在使用大型 BLOB 列),则可以通过设置服务器的 max_allowed_packet 变量来增加查询限制,该变量的默认值为 4MB。您可能还需要增加客户端的最大数据包大小。有关设置数据包大小的更多信息,请参见第 B.5.2.10 节“数据包太大”。
插入大量行的 INSERT 或 REPLACE 语句也可能导致此类错误。这些语句中的任何一个都会向服务器发送单个请求,而不管要插入的行数是多少;因此,通常可以通过减少每次 INSERT 或 REPLACE 发送的行数来避免错误。
如果您的客户端版本低于 4.0.8 并且您的服务器版本为 4.0.8 及以上,或者反之亦然,如果您发送 16MB 或更大的数据包,您也会丢失连接。
如果主机名查找失败(例如,如果您的服务器或网络所依赖的 DNS 服务器出现故障),也可能会看到此错误。这是因为 MySQL 依赖于主机系统进行名称解析,但无法知道它是否正常工作 — 从 MySQL 的角度来看,该问题与任何其他网络超时没有区别。
如果 MySQL 使用 --skip-networking 选项启动,您还可能会看到 MySQL 服务器已消失错误。
如果 MySQL 端口(默认 3306)被防火墙阻止,从而阻止与 MySQL 服务器的任何连接,则可能会出现另一个导致此错误的网络问题。
对于派生子进程的应用程序,所有这些子进程都尝试使用与 MySQL 服务器的相同连接,您也可能会遇到此错误。通过为每个子进程使用单独的连接可以避免这种情况。
您遇到了服务器在执行查询时死机的错误。
检查此链接:走了
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)