当我使用一个只从2列中获取5行数据的SELECT
语句,然后让脚本休眠10分钟,然后唤醒以将INSERT
继续到数据库中时,我就得到了Warning Error while sending QUERY packet in PID=
。
如果我在SELECT
语句之后关闭连接,并在INSERT
之前重新打开连接,那么一切工作正常,不会产生任何错误。
我不明白为什么会发生这样的事情。我在公共共享服务器上。
选择
选择的值是:长度为10个字符的Seller
和长度为872个字符的Token
。
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",
),
);
发布于 2019-02-20 04:41:33
mysql连接在30秒后超时,即在30秒不活动后自动关闭,您对此无能为力(除了在睡眠时每29秒轮询一次)。如有必要,我建议您在睡眠后使用mysqli::ping重新连接:
if ($con->ping()) {
// foreach... insert
}
https://stackoverflow.com/questions/54771567
复制相似问题