关于php:MDB2在重新连接时会断开连接并忘记字符集设置

关于php:MDB2在重新连接时会断开连接并忘记字符集设置

MDB2 disconnects and forgets charset setting when reconnecting

我们最近调试了一个奇怪的错误。找到了解决方案,但是该解决方案并不完全令人满意。

我们使用IntSmarty来本地化我们的网站,并使用我们自己的包装器将本地化的字符串存储在数据库中。 IntSmarty在其析构函数中保存它可能具有的所有新字符串,从而导致数据库调用。

我们使用MDB2的Singleton实例针对MySQL进行查询,并且在连接后,我们使用SetCharset()函数将字符集更改为UTF-8。我们发现在完成最终插入时,IntSmarty保存的字符串被解释为ISO-8859-1。我们仔细查看了查询日志,发现在调用IntSmarty的析构函数之前,MySQL连接已断开连接。然后重新建立它,但是在新连接上没有发出" SET NAMES utf8"查询。这导致保存的字符串被MySQL解释为ISO-8859-1。

似乎没有设置MDB2上默认字符集的选项。我们针对此问题的解决方案是通过添加以下内容来更改MySQL服务器配置

1
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对象,那应该可以解决您的问题。


推荐阅读