Php 发送查询数据包时出错

Php 发送查询数据包时出错,php,mysql,Php,Mysql,我试图向数据库中插入一些数据,但出现了以下错误“发送查询数据包时出错” 但我认为问题在于数据的大小超过了16MB。 该列的数据类型设置为longtext,我认为它可以保持4GB的数据量 我不知道PDOs是否在运行查询或将16MB数据传输到数据库时遇到问题。 这是我唯一的猜测,因为mysql可能以数据包的形式发送数据,而数据包不能容纳16MB的数据。在INSERT语句中不能有WHERE子句 插入表1(数据)值(:data),其中sno='45830' 应该是 插入表1(数据)值(:data) 更

我试图向数据库中插入一些数据,但出现了以下错误“发送查询数据包时出错”

但我认为问题在于数据的大小超过了16MB。
该列的数据类型设置为longtext,我认为它可以保持4GB的数据量

我不知道PDOs是否在运行查询或将16MB数据传输到数据库时遇到问题。

这是我唯一的猜测,因为mysql可能以数据包的形式发送数据,而数据包不能容纳16MB的数据。

INSERT
语句中不能有
WHERE
子句

插入表1(数据)值(:data),其中sno='45830'

应该是

插入表1(数据)值(:data)


更新:您已将其从代码中删除(我假设您复制的代码是错误的)。您想增加允许的数据包大小:


设置全局最大允许分组数=32M


根据需要向上/向下更改
32M
(32兆字节)

您猜对了,MySQL对数据大小有限制,您需要将您的查询分为一小组记录,或者您可以使用
设置全局最大允许数据包=524288000来更改您的最大允许数据包

如果变量
等待超时时间
过低,也可能出现此错误

如果是,您可以将其设置得更高,如下所示:

SET GLOBAL wait_timeout=10;

这是我的案例中相同错误的解决方案。

/etc/my.cnf
中添加:

  max_allowed_packet=32M
这对我有用。您可以通过进入PHPMyAdmin并打开SQL命令窗口并执行以下操作进行验证:

SHOW VARIABLES LIKE  'max_allowed_packet'
SHOW VARIABLES LIKE 'max_allowed_packet'

您可以通过以下几个步骤解决此问题:

1) 打开终端窗口

2) 请在终端中写入以下命令

ssh root@yourIP port
3) 输入根密码

4) 现在使用下面的命令编辑您的服务器my.cnf文件

nano /etc/my.cnf  
如果无法识别该命令,请先执行此操作,或者尝试vi,然后重复:yum install nano

  vi /etc/my.cnf 
5) 在[MYSQLD]部分下添加行:

max_allowed_packet=524288000 (obviously adjust size for whatever you need) 
wait_timeout = 100
6) Control+O(保存),然后输入(确认),然后Control+X(退出文件)

7) 然后按照以下命令重新启动mysql服务器

/etc/init.d/mysql stop
/etc/init.d/mysql start
8) 您可以通过进入PHPMyAdmin或打开SQL命令窗口并执行以下操作进行验证:

SHOW VARIABLES LIKE  'max_allowed_packet'
SHOW VARIABLES LIKE 'max_allowed_packet'

这对我有用。我希望它能为您工作。

我在cygwin遇到了一个罕见的edge案例,在执行
exec('rsync')时会出现此错误查询之前的某个位置。这可能是一个普通的PHP问题,但我只能在cygwin中用rsync重现这个问题

$pdo = new PDO('mysql:host=127.0.0.1;dbname=mysql', 'root');
var_dump($pdo->query('SELECT * FROM db'));
exec('rsync');
var_dump($pdo->query('SELECT * FROM db'));
产生

object(PDOStatement)#2 (1) {
   ["queryString"]=>
   string(16) "SELECT * FROM db"
}
PHP Warning:  Error while sending QUERY packet. PID=15036 in test.php on line 5
bool(false)

中报告的错误如果由于数据库服务器的
max_allowed_packet
设置导致插入“过多数据”失败,则会发出以下警告:

SQLSTATE[08S01]: Communication link failure: 1153 Got a packet bigger than 
'max_allowed_packet' bytes
如果此警告被捕获为异常(由于设置错误处理程序),则数据库连接(可能)丢失,但应用程序不知道这一点(插入失败可能有多种原因)。 行中的下一个查询,可以简单到:

SELECT 1 FROM DUAL
然后将失败并出现错误,因此问题开始:

Error while sending QUERY packet. PID=18486
简单的测试脚本要重现我的解释,请尝试使用错误处理程序和不使用错误处理程序,以查看影响的差异:

set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext) {
    // error was suppressed with the @-operator
    if (0 === error_reporting()) {
        return false;
    }

    throw new ErrorException($errstr, 0, $errno, $errfile, $errline);
});

try
{
    // $oDb is instance of PDO
    var_dump($oDb->query('SELECT 1 FROM DUAL'));

    $oStatement = $oDb->prepare('INSERT INTO `test` (`id`, `message`) VALUES (NULL, :message);');
    $oStatement->bindParam(':message', $largetext, PDO::PARAM_STR);
    var_dump($oStatement->execute());
}
catch(Exception $e)
{
    $e->getMessage();
}
var_dump($oDb->query('SELECT 2 FROM DUAL'));

在php中为命令行执行forking时遇到了这样的问题。在我的例子中,php有时会杀死子进程。要解决这个问题,只需使用命令pcntl_wait($status)等待进程完成

下面是一段可视示例代码:

    #!/bin/php -n
    <?php
    error_reporting(E_ALL & ~E_NOTICE);
    ini_set("log_errors", 1);
    ini_set('error_log', '/media/logs/php/fork.log');
    $ski = substr(str_shuffle(str_repeat("0123456789abcdefghijklmnopqrstuvwxyz", 5)), 0, 5);
    error_log(getmypid().' '.$ski.' start my php');

    $pid = pcntl_fork();
    if($pid) {
    error_log(getmypid().' '.$ski.' start 2');
    // Wait for children to return. Otherwise they 
    // would turn into "Zombie" processes
    // !!!!!! add this !!!!!!
    pcntl_wait($status);
    // !!!!!! add this !!!!!!
    } else {
    error_log(getmypid().' '.$ski.' start 3');
    //[03-Apr-2020 12:13:47 UTC] PHP Warning:  Error while sending QUERY packet. PID=18048 in /speed/sport/fortest.php on line 22457
    mysqli_query($con,$query,MYSQLI_ASYNC);
error_log(getmypid().' '.$ski.' sleep child');
  sleep(15);
    exit;
    } 

   error_log(getmypid().' '.$ski.'end my php');
    exit(0);
    ?>
#/bin/php-n

我在my.ini文件中将max_allowed_packet设置为256M,但不起作用。如果我启动一个查询以设置全局max_allowed_packet=524288000;我得到这个错误“检查与您的MySQL服务器版本对应的手册,以了解在第1行的“SET GLOBAL max_allowed_packet=524288000”附近使用的正确语法”是否有记录触发此警告的查询的方法?哇,太酷了,它对我有效。我认为这是从日志中得到的,并且还要确保检查您的帖子的最大大小和在php中上传的文件大小。iniSET GLOBAL max max_allowed_packet=32M在mysql中不起作用,它表示参数无效。但如果我启动一个查询来设置全局max_allowed_packet=524288000;我得到了这个错误“检查与MySQL服务器版本相对应的手册,以获得在第1行的“SET GLOBAL max_allowed_packet=524288000”附近使用的正确语法”您可以运行
显示变量,如“max_allowed_packet”
查看您的最大值实际是多少。您是否在共享主机上?如果是,则可能会对您禁用。这是永久性的,还是在mysql重新启动后您必须再次执行此操作?@cjhill很抱歉,让我先阅读整个文档,然后再问一个普通的问题,这将帮助您在这里更快地回答问题。这是错误的-即使您链接的页面也特别说明了这一点在服务器启动时设置变量时,可以使用指定值乘数的后缀,但不能在运行时使用set设置值“。换句话说,您可以执行
32*1024*1024
,但不能执行
32M
等待超时时间为28800秒。你为什么要把它降到100?对上面的评论有什么回答吗?我很想知道为什么只有100个。。。我有500MB的max_allowed_数据包,等待\u超时100,它仍在崩溃,并显示相同的错误消息。可能是什么?也许,100比某些主机的自定义默认值高?但这只是一个猜测。请注意,如果您在AWS上:我必须执行sudo vi/etc/my.cnf,而要重新启动mysql,我必须执行sudo服务mysqld restart获得相同的错误注意此变量的低值。我花了太多的时间才意识到剧本的深处有一个地方是睡眠(70);这导致数据库连接丢失,因此“发送查询数据包时出错”。因此,要么考虑至少设置为分钟,要么将你的DB设置为保持连接的别名。