MDB2断开连接,并在重新连接时忘记了字符集设置
时间:2020-03-05 18:58:15 来源:igfitidea点击:
我们最近调试了一个奇怪的错误。找到了解决方案,但是该解决方案并不完全令人满意。
我们使用IntSmarty对我们的网站进行本地化,并使用我们自己的包装将本地化的字符串存储在数据库中。 IntSmarty在其析构函数中保存它可能具有的所有新字符串,从而导致数据库调用。
我们使用MDB2的Singleton实例针对MySQL进行查询,并且在连接后,我们使用SetCharset()函数将字符集更改为UTF-8. 我们发现在完成最终插入时,IntSmarty保存的字符串被解释为ISO-8859-1. 我们仔细查看了查询日志,发现在调用IntSmarty的析构函数之前,MySQL连接已断开连接。然后重新建立它,但是在新连接上未发出" SET NAMES utf8"查询。结果是保存的字符串被MySQL解释为ISO-8859-1.
似乎没有设置MDB2上默认字符集的选项。我们针对此问题的解决方案是通过添加以下内容来更改MySQL服务器配置
init-connect='SET NAMES utf8'
到my.cnf。这仅解决了我们的字符集始终相同的问题。
因此,有什么方法可以防止在运行所有查询之前断开连接吗?我可以强制在其他所有操作之后销毁MDB2实例吗?
打开持久连接有效,但不是理想的答案。
解决方案
回答
从PHP5文档中:
The destructor method will be called as soon as all references to a particular object are removed or when the object is explicitly destroyed or in any order in shutdown sequence. PHP documentation
(强调我的)
可能发生的情况是脚本没有显式销毁对象,因此,当PHP到达脚本的末尾时,它将开始按照其感觉的顺序清理所有内容-在情况下,这是先关闭数据库链接。
如果在脚本实际结束之前显式销毁IntSmarty对象,那应该可以解决问题。