首页 > 解决方案 > 如果连接未关闭并重新打开,则发送 QUERY 数据包时 MySQl 错误

问题描述

Warning Error while sending QUERY packet in PID=当我使用仅从 2 列中SELECT获取5 行数据的语句时,我得到了这样的结果,然后让脚本休眠 10 分钟,然后醒来继续INSERT进入数据库。

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

我无法弄清楚为什么会这样。我在公共共享服务器上。

选择

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

include('con.php');
if ($result = $con->query("SELECT Seller,Token FROM `Sellers`")) { 
    $sellers = $result->fetch_all(MYSQLI_ASSOC);
    $result->close();
}
$con->close();

睡觉

sleep(600);

插入

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

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。

set_time_limit(0);

这是产生错误的代码。

导致错误的代码

选择

include('con.php');
if ($result = $con->query("SELECT Seller,Token FROM `Sellers`")) { 
    $sellers = $result->fetch_all(MYSQLI_ASSOC);
    $result->close();
}

睡觉

sleep(600);

插入

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'

$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",
    ),
);

标签: phpmysql

解决方案


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

if ($con->ping()) {
    // foreach... insert
}

推荐阅读