Битрикс24. Смена кодировки сайта Bitrix24 c CP-1251 на UTF-8, заметки

Andy Wits Blog

Битрикс24. Смена кодировки сайта Bitrix24 c CP-1251 на UTF-8, заметки

Используем оффициальную документацию: dev.1c-bitrix.ru/learning/course...

От себя добавлю несколько дополнительных моментов.

Шаг 1

"Эксперные настройки бэкапа в Битрикс24"

Перед шагом 1 сделаем необходимые бэкапы. Убедимся, что на сайте никого нет и сделаем вручную с экспертными настройками, но без бэкапов и хранилища, чтобы сэкономить место. Бэкапы с хранилищем у нас ведь есть в регулярных бэкапах? :)

tar --exclude="upload" --exclude="bitrix/backup" -czvf bitrix.YOURNAME.com.tar.gz bitrix.YOURNAME.com

Также перед перекодировкой файлов хорошо бы иметь бэкап файлов отдельно. Поднимемся в папку /home/bitrix и сделаем:

cd /home/bitrix
tar --exclude="upload" --exclude="bitrix/backup" -czvf bitrix.YOURNAME.com.tar.gz www

где www - файлы сайта битрикс.

Дальше проделаем шаги 1-3

Но это ещё не все конфигурационные файлы, где может быть прописана кодировка. У нас оказалось ещё прописано local value, как указано на странице phpinfo:

phpinfo with Bitrix24

Я нашёл, что в этих файлах:

/etc/httpd/bx/conf/bx_ext_bitrix.YOURNAME.com.conf
/etc/httpd/bx/conf/default.conf

был прописан параметр:

php_admin_value default_charset cp1251

Пришлось закомментировать эту строку и вежливо попросить апач перечитать конфиг:

apachectl graceful

Дальше выполняем шаги 4 и 5 в папке /home/bitrix/www

(смотрите ссылку на руководство в начале)

По 6 шагу один нюанс.

Чтобы сконвертировать базу мы получаем список запросов, как указано в руководстве. Для удобства, сгенерированный список запросов можно сохранить в файл и положить в папке, откуда мы запустили на сервере в терминале mysql -u ...

и затем выполнить запросы из файла:

source bitrix_new_utf8_convert.sql;

Потом выполним 7 и 8 шаги

Например, в файле "bitrix/php_interface/after_connect_d7.php" нужно поменять код на такой:

<?
$this->queryExecute("SET NAMES 'utf8'");
$this->queryExecute('SET collation_connection = "utf8_unicode_ci"');
?>

Теперь 9 шаг - перекодировка всех файлов.

Скрипт, который предлагатся в руководстве не самый оптимальный. Мы его улучшим. У себя я обнаружил, что кроме русского языка в кодировке cp1251 есть и другие языки, но они были добавлены позже и все они в utf-8. Также английский язык в кодировке по-умолчанию iso...

Вот команда, которая найдёт все файлы, исключая те, которые являются utf-8, выведет по очереди на экран и сконвертирует, оставив копию каждого файла, добавив к нему .icv

find ./ -name "*.php" -type f |
while read file
do
  if ! file -bi $file | grep -q 'utf-8'
  then
    echo " $file"
    mv "$file" "$file".icv
    iconv -f WINDOWS-1251 -t UTF-8 "$file".icv > "$file"
  fi
done

Файликов .icv станет немало, десятки тысяч. Их можно посчитать командой:

cd /home/birix/www
find ./ -name "*.php.icv" -type f | wc

Позже, если всё в порядке, эти копии можно будет удалить такой командой:

cd /home/birix/www
find ./ -type f -name '*.php.icv' -delete

Если всё же использовать xargs, лучше так:

cd /home/birix/www
find ./ -type f -name '*.php.icv' -print0 | xargs -0 rm

p.s. После перекодировки могут возникнуть ошибки в БД.

Ошибки в базе данных Битрикс после перекодировки

Чтобы их исправить, можно просто выполнить предлагаемые запросы через консоль.

Однако, 2 запроса у меня не сработали:

ALTER TABLE `bitrix_88`.`b_search_stem` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;  
ALTER TABLE `bitrix_88`.`b_search_tags` CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

Выдаёт ошибку: "DUPLICATE ENTRY .. for key PRIMARY"

Обнаружил, что может потребоваться вручную в БД исправить некоторые таблицы, так как у них "COLLATE cp1251_bin":

Кодировка в таблице Search_Tags

Нашёл такое решение: пересоздать такие таблицы. То есть сделать чистые копии, перекодировать и удалить старые:

CREATE TABLE b_search_stem_new LIKE b_search_stem;  
ALTER TABLE b_search_stem_new CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;  
INSERT INTO b_search_stem_new SELECT * FROM b_search_stem ON DUPLICATE KEY UPDATE STEM  = VALUES(STEM);  
ALTER TABLE b_search_stem RENAME b_search_stem_old;  
ALTER TABLE b_search_stem_new RENAME b_search_stem;  
// потом, можно удалить табличку _old:  
DROP TABLE b_search_stem_old;  
  
  
CREATE TABLE b_search_tags_new LIKE b_search_tags;  
ALTER TABLE b_search_tags_new CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;  
INSERT INTO b_search_tags_new SELECT * FROM b_search_tags ON DUPLICATE KEY UPDATE NAME  = VALUES(NAME);  
ALTER TABLE b_search_tags RENAME b_search_tags_old;  
ALTER TABLE b_search_tags_new RENAME b_search_tags;  
// потом, можно удалить табличку _old:  
DROP TABLE b_search_tags_old;

(Данные, которые в них в принципе не особо нужны. Но при желании можно сделать дамп).

Published on May 06 2024 at 7:11 am
Time to read 2 minute(s)
Categories
  • System Administration

Contact me on