0

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

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

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

似乎没有在 MDB2 上设置默认字符集的选项。我们对这个问题的解决方案是更改 MySQL 服务器配置,通过添加

init-connect='SET NAMES utf8'

到我的.cnf。这只解决了我们的字符集总是一样的问题。

那么,有什么方法可以防止在所有查询运行之前断开连接?我可以强制 MDB2 实例在其他所有操作之后被破坏吗?

打开持久连接有效,但不是理想的答案。

4

1 回答 1

1

来自 PHP5 文档:

一旦对特定对象的所有引用被删除或对象被显式销毁或以关闭序列中的任何顺序调用,就会调用析构函数方法。

PHP 文档

(强调我的)

可能发生的情况是您的脚本没有显式销毁对象,因此当 PHP 到达脚本末尾时,它开始以任何感觉的顺序清理事物 - 在您的情况下,首先关闭数据库链接.

如果您在脚本实际结束之前明确销毁 IntSmarty 对象,那应该可以解决您的问题。

于 2008-09-18T05:47:57.920 回答