Четверг , 18 Апрель 2024
ДомойПубликацииОбновление SMF. Решение проблем с кодировкой

Обновление SMF. Решение проблем с кодировкой

Не далее, как сегодня, мне потребовалось обновить форум типа SMF (Simple Machines Forum) с версии 1.0 до 2.0RC1. В принципе, сам по себе процесс обновления проходит без проблем. Однако есть некоторые моменты, на которых я бы хотел остановиться подробнее. Что усугубляло ситуацию, так это кодировка. Версия 1.0 крутилась на cp1251, но версию 2.0 я непременно хотел видеть на вездесущей utf-8.

forum11-720x480

Итак, для начала нам нужно «достать» дистрибутив 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. Оказывается, чтобы иметь возможность искать, мне нужно зарегистрироваться. Ну ребята, вы бы хоть капчу сделали, если чрезмерной нагрузки на сервер боитесь…

ss1_smf

Регистрация — это не наши методы! Начинаю перебор соответсвующих разделось. Ищу сообщения, в которых говорится о проблемах с кодировкой. Как ни странно, ответы сводились к нескольким однотипным предложениям (не считая предложений починить кривы руки). Одно из предложений — установка параметра $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';

Перезагружаем страничку форума и с удовлетворением обнаруживаем, что всё стало работать правильно (чего я, собственно, и добивался).

Рейтинг: 0

Автор публикации

2 070
не в сети 12 месяцев

x64 (aka andi)

Комментарии: 2893Публикации: 405Регистрация: 02-04-2009
Так себеНеплохоХорошоЗамечательноСупер! (Оценок пока нет)
Загрузка...

4 комментария

  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

    Рейтинг: 0
  2. Виталий,
    поле `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’;

    Рейтинг: 0
  3. Спасибо огромное! Рехнулся бы всю цепочку действий повторять!)

    Рейтинг: 0
  4. Обновил форум на RC4 появился глюк с кодировкой. Скопировал на сервер старый файл Settings.php и всё поправилось.

    Рейтинг: 0

Оставить комментарий

Политика конфиденциальности

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

Принять