Не далее, как сегодня, мне потребовалось обновить форум типа SMF (Simple Machines Forum) с версии 1.0 до 2.0RC1. В принципе, сам по себе процесс обновления проходит без проблем. Однако есть некоторые моменты, на которых я бы хотел остановиться подробнее. Что усугубляло ситуацию, так это кодировка. Версия 1.0 крутилась на cp1251, но версию 2.0 я непременно хотел видеть на вездесущей utf-8.
Итак, для начала нам нужно «достать» дистрибутив SMF 2.0 RC1, и не абы какой, а именно Upgrade. Сделать это можно на странице download.simplemachines.org/index.php. По этому адресу находится несколько разношерстных версий. Т. к. всё затевалось для перехода с версии 1.0 на 2.0, я скачал Large upgrade версии SMF 2.0 RC1.
Также потребуются файлы с переводом, который находятся по адресу download.simplemachines.org/?languages.
Далее, свежескачанный дистрибутив распаковываем в директорий с форумом (на хосте!), и запускаем файл http://текущий_хост/папка_форума/upgrade.php.
На этом этапе у меня появилось предупреждение, что с языковыми файлами какие-то траблы. Дабы не искушать судьбу и не попасть в ситуацию, когда нужные ссылки будут недоступны (а всё из-за того, что не будет русского перевода требуемых слов), я выбрал использование английского языка и процесс пошёл, пошёл и… заглох. Была явлена ошибка базы данных следующего содержания:
Thread stack overrun: 132012 bytes used of a 196608 byte stack, and 65536 bytes needed. Use 'mysqld -O thread_stack=#' to specify a bigger stack.
Для меня всё закончилось хорошо. Во-первых, обновление производил на локальном хосте, и во-вторых, форум стоит на выделенном сервере, где у меня тоже есть возможность изменить конфигурацию в случае проблем.
Вернёмся к ошибке. Данная проблема характерна, когда происходит переполнение стека. Как видно из листинга, требуется увеличить переменную thread_stack. Сделать это не удастся иначе, как посредством правки файла конфигурации. Открываем файл my.cnf и устанавливаем переменную следующим образом:
thread_stack = 1M
Скорее всего, этого не потребуется. И данный случай актуален именно для локального тестирования. На компьютере у меня стоит Денвер, поэтому данная проблема актуальна для тех, кто использует данный дистрибутив.
Итак, изменяем указанную переменную, перезапускаем сервер и снова пытаемся выполнить upgrade.php. На этот раз всё проходит на ура!
После сообщения об успешном обновлении пытаюсь зайти на форум. Успешно. Однако вместо русских букв всякие зюки. Что же, было ожидаемо. В первую очередь переконвертируем файл Settings.php. Сделать это можно любым мало-мальски вменяемым редактором. Хотя бы с помощью Notepad2. Хорошая штука, кстати. Рекомендую.
Теперь, просим браузер показать исходный код страницы. Нас интересуют параметры тега meta:
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
Вот оно что! Вместо ожидаемого utf-8 имеем западноевропейскую. Идём в темы и смотрим содержимое файла index.russian-utf8.php. Видим такую строку:
$txt['lang_character_set'] = 'UTF-8';
Получается, проблема не в этом.
Что же, пришло время обратиться к людям, которые на SMF собаку съели (по крайней мере, должны были). Иду на форум русского коммьюнити, simplemachines.ru. Как человек razoomный, юзаю поиск. Оп-па, сюрприз № 1. Оказывается, чтобы иметь возможность искать, мне нужно зарегистрироваться. Ну ребята, вы бы хоть капчу сделали, если чрезмерной нагрузки на сервер боитесь…
Регистрация — это не наши методы! Начинаю перебор соответсвующих разделось. Ищу сообщения, в которых говорится о проблемах с кодировкой. Как ни странно, ответы сводились к нескольким однотипным предложениям (не считая предложений починить кривы руки). Одно из предложений — установка параметра $db_character_set в файле Settings.php (в своё время, кстати, мне таким же способом пришлось облазить исходники, дабы найти параметр, отвечающий за установку требуемой кодировки при коннекте к БД). Естественно, это не то, что мне требовалось (тем более, что этот параметр у меня установлен). Ещё советовали перевести файлы с русификаей в utf-8 (ну здесь, во-первых, я уже качал русик для utf-8, и во-вторых, я его проверял. А уж cp1251 от utf-8 отличить в состоянии). В общем, тоже не то.
Был ещё один ответ. Некий деятель, с оттенком глубоко снисхождения в словах, глаголил на уровне аксиомы, что нужно узнать, в какой кодировке работал старый форум, и для русификации сказать соответствующий дистрибутив переводов: utf-8 или cp1251, причём, по его словам получалось, что это единственно возможный вариант. Мне это тоже не подходило никоим образом.
Покопавшись ещё немного на форуме и не найдя ничего полезного, решил раньше времени не расстраиваться, и не впадать в отчаяние. У меня оставался метод «грубой силы».
Грубую силу было решено применить с главного шаблона. Открыв файл index.template.php, увидел буквально следующее:
'<meta http-equiv="Content-Type" content="text/html; charset=', $context['character_set'], '" />'
Теперь осталось пробежаться по коду и выяснить, где происходит присваивание кодировки данному элементу массива. Дальнейшие раскопки привели к файлу Load.php и соответствующему куску кода:
$context['character_set'] = empty($modSettings['global_character_set'])…
За формирование массива $modSettings отвечает, в частности, табличка `settings` (я не пишу префикс, поэтому у вас, скорее всего, таблица называется `smf_settings`). Отвечает это конечно сильно сказано, просто данные из этой таблицы заносятся в требуемый массив. Естественно, просмотря таблицу я не нашёл параметр global_character_set. Что же, исправим это недоразумение. С помощью хотя бы PhpMyAdmin выполним следующий запрос:
INSERT INTO `settings`
SET `variable` = 'global_character_set', `value` = 'UTF-8';
Перезагружаем страничку форума и с удовлетворением обнаруживаем, что всё стало работать правильно (чего я, собственно, и добивался).
днём интернета
шоколадкой для работы мозга
коробочкой ароматного чая для бодрости
продлением хостинга на +1 месяц
Ошибка следующего характера после выполнения запроса
Ответ MySQL: Документация
#1062 — Duplicate entry ‘global_character_set’ for key ‘PRIMARY’
Warning: Invalid argument supplied for foreach() in /home/virtwww/w_mysql57_109824ae/http/libraries/common.lib.php on line 720
Виталий,
поле `variable` описано как PRIMARY, и должно быть уникальным для каждой записи таблицы.
нужно обновить данную запись (посредством UPDATE) либо использовать более универсальную конструкцию:
REPLACE `smf_settings`
SET `variable` = ‘global_character_set’, `value` = ‘UTF-8’;
запись выше фактически аналогична INSERT, но если при вставке найдено дублирующее значение уникального индекса (в данном случае, первичного ключа), аналогом будет являться пара:
DELETE FROM `smf_settings` WHERE `variable` = ‘global_character_set’;
INSERT INTO `smf_settings`
SET `variable` = ‘global_character_set’, `value` = ‘UTF-8’;
Спасибо огромное! Рехнулся бы всю цепочку действий повторять!)
Обновил форум на RC4 появился глюк с кодировкой. Скопировал на сервер старый файл Settings.php и всё поправилось.