接手了同事的项目,其中有一个功能是保存邮件模板(包含图片),同事以前的作法是把图片进行base64编码而后存在mysql数据库中(字段类型为mediumtext)
而后保存三张图片(大概400k)的时候报错
MySQL server has gone awayphp
而后查看官方文档https://dev.mysql.com/doc/ref...html
得知多是如下几个缘由 服务器超时 服务器断开 向服务器发送不正确或太大的查询 INSERT或者 REPLACE是插入大量行
开始觉得是服务器超时致使的,在网上搜的解决办法(好吧,先试一下 ,发现仍是不行):mysql
<?php $dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array( PDO::ATTR_PERSISTENT => true )); ?> Note: 若是想使用持久链接,必须在传递给 PDO 构造函数的驱动选项数组中设置 PDO::ATTR_PERSISTENT 。若是是在对象初始化以后用 PDO::setAttribute() 设置此属性,则驱动程序将不会使用持久链接。
直接在Navicat上执行sql语句,报错 [Err] 1153 - Got a packet bigger than 'max_allowed_packet' bytes
搜索得知:当MySQL客户端或mysqld服务器收到大于max_allowed_packet字节的信息包时,将发出“信息包过大”错误,并关闭链接。对于某些客户端,若是通讯信息包过大,在执行查询期间,可能会遇到“丢失与MySQL服务器的链接”错误。
客户端和服务器均有本身的max_allowed_packet变量,所以,如你打算处理大的信息包,必须增长客户端和服务器上的该变量。通常状况下,服务器默认max-allowed-packet为1MB
这下问题精肯定位了,就是max_allowed_packet配置的问题,sql
查一下配置 show VARIABLES like '%max_allowed_packet%'; 发现是1048576(1024*1024),也就是1MB,
可是个人图片才400K,不该该啊,而后网上一查:Base64-encoded 数据要比原始数据多占用 33% 左右的空间。
仍是不肯定,直接strlen()返回base64字符串长度1451334,utf8编码下英文字符1字符占1字节,因此base64编码后是1451334B(这个是我本身的理解),大于1MB数据库
修改max_allowed_packet配置 set global max_allowed_packet = 410241024;数组
发现问题完美解决服务器