首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如果连接未关闭并重新打开,则发送查询数据包时出现MySQl错误

如果连接未关闭并重新打开,则发送查询数据包时出现MySQl错误
EN

Stack Overflow用户
提问于 2019-02-20 01:10:09
回答 1查看 2.3K关注 0票数 0

当我使用一个只从2列中获取5行数据的SELECT语句,然后让脚本休眠10分钟,然后唤醒以将INSERT继续到数据库中时,我就得到了Warning Error while sending QUERY packet in PID=

如果我在SELECT语句之后关闭连接,并在INSERT之前重新打开连接,那么一切工作正常,不会产生任何错误。

我不明白为什么会发生这样的事情。我在公共共享服务器上。

选择

选择的值是:长度为10个字符的Seller和长度为872个字符的Token

代码语言:javascript
复制
include('con.php');
if ($result = $con->query("SELECT Seller,Token FROM `Sellers`")) { 
    $sellers = $result->fetch_all(MYSQLI_ASSOC);
    $result->close();
}
$con->close();

睡眠

代码语言:javascript
复制
sleep(600);

插入

插入的所有值的长度都很小,其中21个字符在jobType列中是最长的。从foreach循环中总共插入了5行。

代码语言:javascript
复制
include('con.php');
foreach(...) {
    $insert = "INSERT INTO `jobStatus` (ack, jobId, RefId, Type, Status, error, percent, Seller, creationTime, completionTime) VALUES ('$ack', '$jid', '$frid', '$jtyp', '$jstat', '$errc', '$pcom', '$sid', '$crtime', '$cotime')";

    if($con->query($insert)) {
        echo "inserted into db successfully.\n";
    } else {
        echo "not inserted into db. Query Failed.\n";
    }
}
$con->close();

由于关闭和重新打开语句之间的连接,上面的代码运行时没有错误。

当我在SELECT之后保持连接打开,然后在INSERT之后关闭连接时,我希望它可以正常工作。

有人能指出我需要做些什么才能做到这一点吗?

注意:我已经在脚本中将set_time_limit设置为0。

代码语言:javascript
复制
set_time_limit(0);

这是产生错误的代码。

导致错误代码

选择

代码语言:javascript
复制
include('con.php');
if ($result = $con->query("SELECT Seller,Token FROM `Sellers`")) { 
    $sellers = $result->fetch_all(MYSQLI_ASSOC);
    $result->close();
}

睡眠

代码语言:javascript
复制
sleep(600);

插入

代码语言:javascript
复制
foreach($sellers as $seller) {
    $insert = "INSERT INTO `jobStatus` (ack, jobId, RefId, Type, Status, error, percent, Seller, creationTime, completionTime) VALUES ('$ack', '$jid', '$frid', '$jtyp', '$jstat', '$errc', '$pcom', '$sid', '$crtime', '$cotime')";

    if($con->query($insert)) {
        echo "inserted into db successfully.\n";
    } else {
        echo "not inserted into db. Query Failed.\n";
    }
}
$con->close();

更新:

以下是SHOW VARIABLES LIKE '%timeout'的结果

代码语言:javascript
复制
$SESSION_VARIABLES = array(
    array(
        "Variable_name" => "connect_timeout",
        "Value" => "10",
    ),
    array(
        "Variable_name" => "delayed_insert_timeout",
        "Value" => "300",
    ),
    array(
        "Variable_name" => "innodb_flush_log_at_timeout",
        "Value" => "1",
    ),
    array(
        "Variable_name" => "innodb_lock_wait_timeout",
        "Value" => "50",
    ),
    array(
        "Variable_name" => "innodb_rollback_on_timeout",
        "Value" => "OFF",
    ),
    array(
        "Variable_name" => "interactive_timeout",
        "Value" => "30",
    ),
    array(
        "Variable_name" => "lock_wait_timeout",
        "Value" => "86400",
    ),
    array(
        "Variable_name" => "net_read_timeout",
        "Value" => "30",
    ),
    array(
        "Variable_name" => "net_write_timeout",
        "Value" => "60",
    ),
    array(
        "Variable_name" => "slave_net_timeout",
        "Value" => "60",
    ),
    array(
        "Variable_name" => "thread_pool_idle_timeout",
        "Value" => "60",
    ),
    array(
        "Variable_name" => "wait_timeout",
        "Value" => "30",
    ),
);
EN

回答 1

Stack Overflow用户

发布于 2019-02-20 04:41:33

mysql连接在30秒后超时,即在30秒不活动后自动关闭,您对此无能为力(除了在睡眠时每29秒轮询一次)。如有必要,我建议您在睡眠后使用mysqli::ping重新连接:

代码语言:javascript
复制
if ($con->ping()) {
    // foreach... insert
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54771567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档