使用mysqli Prepare发送STMT_PREPARE数据包时出错

问题描述 投票:1回答:2

我正在运行一个cron工作来发送电子邮件。发送电子邮件后,我更新数据库以标记它们已发送:

$stmt = $this->mysqli->prepare($q))

但我收到错误:Error while sending STMT_PREPARE packet. PID=25982;

错误显示正在执行的代码,并且IN子句中有大约50个整数id用于表的主键:

准备('更新电子邮件设置datesent ='2015-08-28 19:35:49'电子邮件在哪里(?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,?,?,?,?,?,?,?,?)“)

我在共享服务器上,因此更改mysql设置的能力有限。

除了减少?声明中IN的数量,还有什么我可以做的吗?它适用于少量数据。这真的被认为是大量的数据让它窒息吗?

来自phpinfo

mysqli
MysqlI Support  enabled
Client API library version  mysqlnd 5.0.11-dev - 20120503 - $Id: 15d5c781cfcad91193dceae1d2cdd127674ddb3e $ 
Active Persistent Links     0 
Inactive Persistent Links   0 
Active Links    0 

Directive   Local Value
mysqli.allow_local_infile   On
mysqli.allow_persistent On
mysqli.default_host no value
mysqli.default_port 3306
mysqli.default_pw   no value
mysqli.default_socket   /var/lib/mysql/mysql.sock
mysqli.default_user no value
mysqli.max_links    Unlimited
mysqli.max_persistent   Unlimited
mysqli.reconnect    Off

**更新**我的解决方案是使用以下方法设置会话变量:

mysqli->query("SET session wait_timeout=28800");
php mysqli cron prepared-statement
2个回答
0
投票

尝试在/etc/my.cnf中增加这些值

max_allowed_packet
wait_timeout

0
投票

我也遇到了这个问题 - 我在做一些测试的同时在我的文件中添加了sleep(60);线。

根本问题是mysqli连接已经超时。您可以通过此测试检查:

if ($mysqli->ping()) {
    // Connected.
}
else {
    // Not connected.
}

要解决您的问题,您可以增加mysqli超时值(例如,请参阅http://php.net/manual/en/mysqli.options.php)。

和/或,如果您发现没有连接(即,在尝试执行mysqli操作之前使用上面的代码),您应该能够重新启动连接。 (在此之前,首先调用$mysqli->close();可能是必要/最安全的,只是为了确保旧资源正确释放。)

© www.soinside.com 2019 - 2024. All rights reserved.