我正在运行一个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");
尝试在/etc/my.cnf
中增加这些值
max_allowed_packet
wait_timeout
我也遇到了这个问题 - 我在做一些测试的同时在我的文件中添加了sleep(60);
线。
根本问题是mysqli连接已经超时。您可以通过此测试检查:
if ($mysqli->ping()) {
// Connected.
}
else {
// Not connected.
}
要解决您的问题,您可以增加mysqli超时值(例如,请参阅http://php.net/manual/en/mysqli.options.php)。
和/或,如果您发现没有连接(即,在尝试执行mysqli操作之前使用上面的代码),您应该能够重新启动连接。 (在此之前,首先调用$mysqli->close();
可能是必要/最安全的,只是为了确保旧资源正确释放。)