MDB2 отключается и забывает настройку кодировки при переподключении - PullRequest
0 голосов
/ 17 сентября 2008

Мы недавно отладили странную ошибку. Решение было найдено, но решение не совсем удовлетворительное.

Мы используем 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 быть уничтоженным после всего остального?

Включение постоянных соединений работает, но не является желаемым ответом.

1 Ответ

1 голос
/ 18 сентября 2008

Из документации по PHP5:

Метод деструктора будет вызван, как только будут удалены все ссылки на конкретный объект или когда объект явно уничтожен или в любом порядке в последовательности выключения.

PHP документация

(акцент мой)

Что, вероятно, происходит, так это то, что ваш скрипт не уничтожает объект явным образом, и поэтому, когда PHP достигает конца скрипта, он начинает убирать вещи в любом порядке - как в вашем случае, закрытие ссылка на базу данных в первую очередь.

Если вы явно уничтожите объект IntSmarty до фактического завершения сценария, это должно решить вашу проблему.

...