Мы недавно отладили странную ошибку. Решение было найдено, но решение не совсем удовлетворительное.
Мы используем IntSmarty для локализации нашего веб-сайта и храним локализованные строки в базе данных, используя нашу собственную оболочку. В своем деструкторе IntSmarty сохраняет любые новые строки, которые могут иметься, что приводит к вызову базы данных.
Мы используем экземпляр Singleton MDB2 для выполнения запросов к MySQL, а после подключения мы использовали функцию SetCharset () - для изменения набора символов на UTF-8. Мы обнаружили, что строки, которые были сохранены IntSmarty, были интерпретированы как ISO-8859-1, когда были сделаны окончательные вставки. Мы внимательно посмотрели журнал запросов и обнаружили, что соединение MySQL было отключено до вызова деструктора IntSmarty. Затем он был восстановлен, но при новом соединении запрос «SET NAMES utf8» не выдавался. Это привело к тому, что сохраненные строки были интерпретированы как ISO-8859-1 MySQL.
Кажется, нет никаких опций, которые устанавливают набор символов по умолчанию на MDB2. Нашим решением этой проблемы было изменение конфигурации сервера MySQL, добавив
init-connect='SET NAMES utf8'
в my.cnf. Это только решает проблему того, что наш набор символов всегда один и тот же.
Итак, есть ли способ предотвратить разрыв соединения до того, как будут выполнены все запросы? Можно ли заставить экземпляр MDB2 быть уничтоженным после всего остального?
Включение постоянных соединений работает, но не является желаемым ответом.