如何解决MySQL“读取通讯数据包出错”错误

时间:2019-08-29 09:16:32

标签: php mysql mysqli

我为网站创建了一些PHP代码,以调用数据库中的存储过程。这将从表格中获取文本,以便我可以动态更新网页上的文本,而无需在代码中进行修改。

到目前为止,这部分效果很好。但是,当我打开MySQL错误日志时,看到以下消息打印出来:

  

与db的连接161中止:'dbname'用户:'username'主机:'localhost'(读取通信数据包时出错)

我已经检查了防火墙,它处于非活动状态。 我试图在PHP代码中使用127.0.0.1代替localhost。 我已经使用“ mysqli_free_result($ result);”清除了结果,这似乎确实消除了我在每个查询中遇到的两个错误之一。 我检查了最大允许的数据包大小,即16M。 我在php.ini文件中未注释扩展名mysqli。

PHP:

<?php
$servername = "localhost";
$username = "username";
$password = "password ";
$dbname = "dbname";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
    die("Connection failed: " . mysqli_connect_error());
}

$sql = "Call StoredProcedure('primarykey',@OutValue);";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
    // output data of each row
    while($row = mysqli_fetch_assoc($result)) {
        echo $row["ColumnHeader"];
    }
} else {
    echo "0 results";
}

mysqli_free_result($result);

$t_id = mysqli_thread_id($conn);
mysqli_kill($conn,$t_id);
mysqli_close($conn);
?>

SQL:

CREATE DEFINER=`username`@`hostname` PROCEDURE `StoredProcedure`(IN PrimaryKey
VARCHAR(50), OUT Result VARCHAR(50))
BEGIN

start transaction;
select ColumnName
from dbname.tablename
where PrimaryKeyColumn = PrimaryKey;
commit;

END

正如我所提到的,我从查询中获得了预期的结果,并且它功能完善,所以我不确定是什么原因。 服务器正在运行MySQL版本5.7.27-0ubuntu0.18.04.1((ubuntu))。任何帮助,将不胜感激!

更新-2019年9月11日:

我试图检查我的PHP脚本执行所需的时间。为此,我添加了从该线程借来的以下代码: Tracking the script execution time in PHP

// Script start
$rustart = getrusage();

// Code ...

// Script end
function rutime($ru, $rus, $index) {
    return ($ru["ru_$index.tv_sec"]*1000 + intval($ru["ru_$index.tv_usec"]/1000))
     -  ($rus["ru_$index.tv_sec"]*1000 + intval($rus["ru_$index.tv_usec"]/1000));
}

$ru = getrusage();
echo "This process used " . rutime($ru, $rustart, "utime") .
    " ms for its computations\n";
echo "It spent " . rutime($ru, $rustart, "stime") .
    " ms in system calls\n";

但是,结果如下:

  

此过程使用0毫秒进行计算,在系统调用中花费了1毫秒

不应引起任何超时。

我还激活了服务器上的常规日志文件,但确实看到它将跟踪查询,如下所示:

  

命令类型,详细信息

     

使用套接字在dbname上连接,用户名@主机名

     

查询,调用StoredProcedure('PrimaryKey',@result)

我很好奇没有显示断开连接的日志,尽管我不知道这是否是MySQL的默认行为。

我发现的另一件奇怪的事情是,MySQL Workbench指出我对存储过程的查询时间平均为7毫秒,但是我能找到的所有资源都指出PHP在继续查询之前要等待查询结束。

  

查询,总时间,最长时间,平均时间

     

CALL StoredProcedure(username @ hostname),98.94、66.26、7.07

简而言之,我仍然没有找到解决该问题的任何方法,但是潜在地有些线索可能最终导致解决方案。

更新-2019年9月18日:

在进一步研究该问题之后,我遇到了以下线程: https://dba.stackexchange.com/questions/144773/mysql-aborted-connection-got-an-error-reading-communication-packets

这表明由于MySQL和PHP安装在同一服务器上,因此它们在争夺RAM。考虑到我的服务器正在Raspberry Pi 3 B型上运行,这似乎是我所面临问题的合理解释。

0 个答案:

没有答案