我接手了一个同事的项目,其中一个是保存邮件模板(含图片)。同事之前的做法是将图片进行base64编码后存储到mysql数据库中(字段类型为mediumtext)然后在保存三张图片(400k左右)的时候报错mysqlserverhasgoneaway,然后查看官方文档https://dev.mysql.com/doc/ref...我了解到可能是以下原因是服务器超时了。服务器断开连接并向服务器发送了不正确或过大的查询。INSERT或REPLACE插入了大量行。我认为这是由服务器超时引起的。我在网上搜索了一个解决方案(好吧,先试试看,但还是不行):true));?>注意:如果要使用持久连接,必须在传递给PDO构造函数的驱动程序选项数组中设置PDO::ATTR_PERSISTENT。如果在对象初始化后使用PDO::setAttribute()设置此属性,驱动程序将不会使用持久连接。直接在Navicat上执行sql语句,报[Err]1153-Gotapacketbiggerthan'max_allowed_pa??cket'bytes。查找发现:当MySQL客户端或mysqld服务器收到大于max_allowed_pa??cket字节的信息包时,会发送“信息包太大”错误并关闭连接。对于某些客户端,如果通信数据包过大,可能会在执行查询时遇到“丢失与MySQL服务器的连接”错误。客户端和服务器都有自己的max_allowed_pa??cket变量,所以如果你打算处理大数据包,你必须在客户端和服务器上增加这个变量。一般情况下,服务器默认的max-allowed-packet为1MB。问题定位准确。是max_allowed_pa??cket配置的问题。检查配置showVARIABLESlike'%max_allowed_pa??cket%';查到是1048576(1024*1024),也就是1MB,但是我的图片只有400K,不应该,然后网上查了一下:Base64编码后的数据比原始数据多占用了33%左右的空间。还是不确定,直接strlen()返回base64字符串长度1451334,utf8编码下1个英文字符占1字节,所以base64编码为1451334B(这是我自己的理解),大于1MB修改max_allowed_pa??cket配置setglobalmax_allowed_pa??cket=410241024;发现问题完美解决
