IPB, WordPress, IP.Board, php-Fusion, Invision Power Board

Обновление форума IP.Board до версии 3

2 083

В IP.Board 3 было сделано много существенных изменений в архитектуре приложения. Одним из самых больших нововведений стала работа форума с UTF-8.

При обновлении вашего старого форума до версии 3, вам скорее всего прийдется столкнуться с необходимостью сконвертировать вашу старую базу в новую (в формате UTF-8).

Данная инструкция поможет сделать шаг за шагом.

Шаг 0. Готов ли ты к переходу?

Прежде чем грезить о переходе на новый форум, необходимо узнать, сможет ли сервер работать с ним.

Для оценки существующей конфигурации PHP, создаем в корневой директории старого форума файл myinfo.php с содержимым:

< ?php
 
phpinfo();

Запускаем скрипт в браузере. Результатом будет табличка следующего вида:

phpinfo

Во-первых, версия PHP - она должна быть 5.1.x, а лучше 5.2.x, если версия PHP 4.x.x или PHP 5.3.x, то форум у вас работать не будет.

Во-вторых, новому IP.Board 3 нужны модули расширения PHP:

- dom
- gd
- iconv
- libxml
- mbstring
- mysqli или mysql
- Reflection
- SimpleXML
- SPL

Если одного из выше перечисленных модулей не будет - форум не будет работать.

В-третьих, крайне желательно наличие следующих модулей:

- json
- sockets
- sphinx
- XCache или APC

Данные модули позволяют оптимизировать работу форума, но они не обязательны для его работы.

В-четвертых, память выделенная для PHP.

Найдите значение memory_limit в таблице на странице. Оно должно быть не менее 32M, идеально 128M, значение надо смотреть в первой колонке (Local Value). Если памяти будет меньше, то форум не сможет нормально обновиться, возникнут проблемы с импортированием стилей, настроек и языков.

Итак, если все условия выполнены - мы готовы к обновлению. Приступим...

Шаг 1. Подготовка.

Прежде чем начинать что-то делать, необходимо подготовить пути отступления на случай непредвиденных ситуаций. Здесь нам крайне помогут следующие инструменты:

- SSH
- SypexDumper
- FTP

Для обладателей SSH

Делаем резервную копию базы данных:
Получаем всю информацию о соединении с БД

> cat ./mydomain.ru/htdocs/forums/conf_global.php | grep sql

$INFO['sql_driver']			=	'mysql';
$INFO['sql_host']			=	'server.mysql';
$INFO['sql_database']			=	'db_forum';
$INFO['sql_user']			=	'db_user';
$INFO['sql_pass']			=	'db_passw';
$INFO['sql_tbl_prefix']			=	'ibf_';
$INFO['sql_debug']			=	'1';
$INFO['mysql_tbl_type']			=	'MyISAM';
$INFO['mysql_codepage']			=	'cp1251';

Путь до conf_global.php у вас конечно будет свой. Здесь все данные для наглядности, у вас они будут другими!

Теперь когда данные нам известны делаем резервную копию базы:

> mysqldump  -h server.mysql -u db_user -p db_forum --default-character-set=cp1251 > dump.sql

И сделаем сразу архивчик:

> tar -czf dump.tar.gz dump.sql

Для обладателей SypexDumper

Подробная инструкция по использованию — Читаем…

Шаг 2. Новые файлы.

Теперь необходимо закачать новые файлы форма на сервер. Для этого в начале разберемся со старыми. Часть из них нам больше уже не понадобиться никогда. Потому удаляем следующие директории и файлы:

./sources
./skin_acp
./retail
./resources
./modules
./lofiversion
./jscripts
./ips_kernel
./interface
./install
./init.php
./index.php
./favicon.ico
./converge_local
./admin.php
./admin

Должны остаться следующие файлы и директории:

./uploads
./style_images
./style_emoticons
./style_captcha
./style_avatars
./conf_global.php
./cache

Теперь берем дистрибутив форума, и все файлы и директории из папки upload закачиваем на сервер при помощи FTP-клиента. Должно получиться так:

./xml.php
./uploads
./style_images
./style_emoticons
./style_captcha
./style_avatars
./robotstxt.txt
./retail
./public
./lofiversion
./ips_kernel
./interface
./initdata.php
./index.php
./hooks
./favicon.ico
./converge_local
./conf_global.php
./cache
./admin

Теперь нужно проверить, что все права на директории расставлены правильно. IP.Board 3 требует записи в следующие директории:

./cache
./cache/tmp
./cache/lang_cache
./cache/lang_cache/1
./cache/skin_cache
./public/style_images
./public/style_css
./hooks
./uploads

И файл ./conf_global.php

Для того чтобы не было проблем выставляем этим директориям и файлу CHMOD 777 (rwxrwxrwx).

Шаг 3. Подготовка к обновлению.

Кодировка в conf_global.php

Ваш старый conf_global нужно изменить, чтобы обновление прошло успешно. Допустим сейчас он выглядит так:

< ?php
$INFO['sql_driver']			=	'mysql';
$INFO['sql_host']			=	'server.mysql';
$INFO['sql_database']			=	'db_forum';
$INFO['sql_user']			=	'db_user';
$INFO['sql_pass']			=	'db_passw';
$INFO['sql_tbl_prefix']			=	'ibf_';
$INFO['sql_debug']			=	'1';
$INFO['board_start']			=	'1246400000';
$INFO['installed']			=	'1';
$INFO['php_ext']			=	'php';
$INFO['safe_mode']			=	'0';
$INFO['board_url']			=	'http://www.mydomain.ru/forum';
$INFO['banned_group']			=	'5';
$INFO['admin_group']			=	'4';
$INFO['guest_group']			=	'2';
$INFO['member_group']			=	'3';
$INFO['auth_group']			=	'1';
$INFO['mysql_tbl_type']			=	'MyISAM';
$INFO['mysql_codepage']			=	'cp1251';

Нам необходимо указать кодировку соединения с базой данных, что бы ее понял новый форум. Для этого после строчки:

$INFO['sql_tbl_prefix']			=	'ibf_';

Добавляем

$INFO['sql_charset']			=	'utf8';

Строчку

$INFO['mysql_codepage']			=	'cp1251';

Можно удалить за ненадобностью.

Перекодирование базы данных

Это очень важный этап. Если его выполнить не верно, дальнейшее обновление форума не будет иметь смысла.

Основная идея перекодирования базы

У нас есть резервная копия базы в файле. Это простой текст в кодировке windows-1251 (cp1251). Для того чтобы перевести этот текст в UTF-8, необходимо воспользоваться конвертером (редактор текста с поддержкой перекодирования, утилита для перекодирования; все что угодно, что может перевести текст из Windows-1251 в UTF-8).

После того как текст переведен в UTF-8, необходимо поправить инструкции в этом тексте, чтобы сама база работала с ним как с UTF-8. А именно есть две команды SET NAMES и DEFAULT CHARSET. На базе cp1251 они выглядят так:

SET NAMES cp1251

) ENGINE=MyISAM DEFAULT CHARSET=cp1251

В нашей резервной копии таких команд больше чем две. Значит нам нужно их заменить во всем файле на

SET NAMES utf8

) ENGINE=MyISAM DEFAULT CHARSET=utf8

Перекодирование средствами SSH

Воспользуемся утилитой iconv для преобразования нашей резервной копии (которую мы делали на первом шаге), делается это так:

>iconv -f cp1251 -t utf8 dump.sql > dump.utf8

Назначение ключей следующее:

-f cp1251 – конвертировать из кодировки cp1251
-t utf8 – в кодировку utf8
dump.sql – файл который надо сконвертировать
> dump.utf8 – результаты конвертации запишутся сюда

Возможно появление проблем при конвертации, которые прервут процесс конвертирования. Это как правило происходит из-за невозможности найти соответствие символов одной кодировки в символы другой. В таких случаях стоит добавить еще один ключ (-c) в вызов iconv. Т.е. команда будет выглядеть уже так:

>iconv -c -f cp1251 -t utf8 dump.sql > dump.utf8

В этом случае при возникновении проблемы при конвертировании, символ будет пропущен, а конвертирование продолжится.

Итак весь текст у нас переведен в UTF-8, теперь необходимо изменить команды SQL. Делается это так

Собственно так как дамп у нас должен быть в правильной cp1251 кодировке, то делаем замену в файле этих значений на новые:

> sed 's/SET NAMES cp1251/SET NAMES utf8/g' < dump.utf8 > 1.dump.utf8
> sed 's/DEFAULT CHARSET=cp1251/DEFAULT CHARSET=utf8/g' < 1.dump.utf8 > dump.utf8.sql

Данную команду наглядно описать с русскими значениями:

sed 's/БЫЛО/СТАЛО/g' < ОТКУДА ЧИТАЕМ > КУДА ЗАПИСЫВАЕМ

Перекодирование подготовленным SypexDumper

В директории Tools дистрибутива мы расположили скрипт измененного SypexDumper, который уже настроен на работу с базой вашего форума. Необходимо закачать данный скрипт в корневую директорию форума на сервере и запустить.

Вводите данные для доступа к базе форума в первом окне.

В следующем окне вам будет предложено сделать дамп базы и восстановить базу из резервной копии.

Делаете дамп базы. После завершения dumper напишет, что резервная копия готова и даст ссылку на ее скачивание. Скачивать не надо. Просто заходим по FTP на сервер форума и убеждаемся, что копия действительно сделана и находится в директории cache. Вы можете скачать этот дамп к себе на компьютер. Запомните имя файла резервной копии.

Возвращаемся к форме дампера из которой вы начали делать резервную копию. Теперь в нем необходимо выбрать восстановление базы.
В первом выпадающем списке выбираете вашу базу данных, во втором — название файла резервной копии. Запускаете восстановление.

После того как восстановление будет завершено. При помощи phpMyAdmin или схожего по возможности инструмента, проверяете, что все таблицы теперь имеют сравнение utf8_general_ci, и все данные внутри таблиц нормально отображаются.

Другие способы

Конвертирование посредством самого MySQL — Конвертирование базы MySQL из кирилицы в UTF8

Если скрипт подвисает на конвертировании базы, в основном на таблице posts, то необходимо воспользоваться модифицированным скриптом и SSH.

Загружаете следующий скрипт в корневую директорию форума:

< ?php
// Database info
 
include("conf_global.php");
 
$dbhost = $INFO['sql_host'];
$dbuser = $INFO['sql_user'];
$dbpass = $INFO['sql_pass'];
$dbname = $INFO['sql_database'];
 
//---------------
 
header('Content-type: text/plain');
 
$dbconn = mysql_connect($dbhost, $dbuser, $dbpass) or die( mysql_error() );
$db = mysql_select_db($dbname) or die( mysql_error() );
 
$sql = "ALTER DATABASE `".$dbname."` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci;n";
 
$exec_sql = 'SHOW TABLES';
$result = mysql_query($exec_sql) or die( mysql_error() );
 
while ( $row = mysql_fetch_row($result) )
{
$table = mysql_real_escape_string($row[0]);
$sql .= "ALTER TABLE `".$table."` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci, CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;n";
}
mysql_close($dbconn);
 
echo $sql;

Запускаете скрипт через браузер. Вы получите список инструкций для выполнения в mysql. Копируете код страницы в файл, например win2utf.sql, и закачиваете данный файл на сервер. Запомните путь к файлу, для примера у нас будет путь /home/user/htdocs/

Заходите на сервер с использованием SSH и выполняете следующую команду:

mysql -uusername -p dbname < /home/user/htdocs/win2utf.sql

Имя пользователя username, имя базы dbname и путь до файла sql запросов у вас должны быть свои.

Вводите пароль и ожидаете завершения работы команды mysql.

Использование специального Perl скрипта

Метод исключительно для SSH.

Скачиваете скрипт:

wget http://www.pablowe.net/convert_charset

Выставляете ему права на запуск

chmod a+x convert_charset

Запускаете конвертацию базы форума в тестовом режиме

./convert_charset --database=database --host=localhost --user=username --askpass --test

В консоль будут выведены команды, которые будет выполнять скрипт. Убедитесь, что все таблицы базы будут сконвертированы. Если скрипт не сможет найти таблицы, выполните следующую команду:

mysql -u username -pDBUSERPASSWORD -e 'SHOW TABLES' database | awk '{if (NR>1) {if (NR==2) {a=$1} else {a=a "," $1}} } END {print a}'

Данные для username, DBUSERPASSWORD и database должны быть вашими.

Вы получите список таблиц в базе, дальше этот список необходимо добавить к ключу –tables

./convert_charset --database=database --host=localhost --user=username --askpass --tables=admin_login_logs,admin_logs,admin_permission_rows,announcements,.... --test

Убедившись, что все таблицы будут затронуты, запустите команду без ключа –test

Восстановление новой базы данных

Наша база сконвертирована и готова к обновлению. Однако ее еще надо восстановить на сервере MySQL.
Сначала необходимо поменять кодировку старой базы.

При наличии SSH

>mysql -u db_user -p db_forum -e 'ALTER DATABASE db_forum DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci'
Enter password:

При отсутствии SSH

В любом доступном интерфейсе для работы с базой данных (например, phpMyAdmin) перейти в базу форума и выполнить запрос

ALTER DATABASE db_forum DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci

Вместо db_forum должно быть название ваше базы!

Теперь развернем базу. Делается это так:

При наличии SSH

>mysql -u db_user -p --default-character-set=utf8 db_forum < ./dump.utf8.sql
Enter password:
>

При отсутствии SSH

Восстанавливать лучше SypexDumper. Закидываете сконвертированную резеврную копию в директорию, куда SypexDumper сохраняет резервные копии баз. И запускаете SypexDumper. Внимательно следуете инструкциям

Дамп развернут, кодировка базы utf8, база готова для обновления.

Шаг 4. Обновление

Теперь у нас все готово, чтобы запустить скрипт обновления. Заходите браузером на страницу:

http://mydomain.ru/forum/admin/upgrade/

и следуете указаниям мастера обновления.

Шаг 5. Ошибки после обновления

Кодировка страниц

Бывает так, что после обновления, зайдя на страницу форума, вы видите что-то подобное:

oh_shit

Проблема в том, что выбирается не правильная кодировка для страниц. Проверьте в АЦ параметр Кодировка страниц форума (АЦ ? Системные настройки ? Настройки серверного окружения ? Кодировка страниц форума) он должен содержать значение utf-8.

Если все правильно, попробуйте создать файл .htaccess в корневой директории сервера, со следующим содержанием:

AddDefaultCharset utf-8
AddCharset utf-8 *

CharsetSourceEnc utf-8
CharsetDefault utf-8

Не все символы выводятся

При просмотре страницы форума, часть символов пропала, а вместо них ромбики:

wtf

Причины может быть две:

1. Вы забыли изменить conf_global.php так как об этом писалось в шаге 1.
Попробуйте выполнить эти изменения, если не поможет внимательно повторите обновление

2. Вы сконвертировали базу, которая уже была в UTF.
Начните обновление с шага 2, но не выполняйте перекодирование базы (самого текста), а только выполните замены команд SQL.

Comments are closed.