Обычная задача по обновлению Битрикс24 обернулась бессонной ночью и кучей потраченных нервов.
Первым делом надо подключаться к консоли и смотреть логи. В них видим ошибку:
PHP Fatal error: Cannot declare class Bitrix\Tasks\MemberTable, because the name is already in use in /home/bitrix/www/bitrix/midules/tasks/lib/member.php on line 15
Ошибка говорит о том, что класс с таким названием уже был объявлен и не может быть использован повторно. К сожалению, скрины сделал не связанные, но, думаю, суть вы уловите.
Создалась целая куча дублей файлов таких как: iblocksite.php и iblocksitetable.php, оба файла содержат класс IblockSiteTable. Опытным путем было обнаружено, что "правильные" файлы содержат "table" в названии, "неправильные" файлы надо переименовать. Удалять сразу не советую, чтобы в случае ошибки можно было быстро откатить изменения.
Я пробовал перезаписывать файлы модулей, но битрикс загрузил только новые (правильные) файлы, а старые оставил как есть, поэтому толку от этого никакого. Предупреждаю, чтобы не тратили время.
Чтоб работа шла быстрее, написал простой bash скрипт, который ищет все дубликаты и подсказывает, в каких есть повторное использование классов.
#!/usr/bin/env bash
search_dir="${1:-.}" # папка из аргумента или текущая
echo "Find doubled bitrix modules files by D1maS91"
echo "Scan directory: $search_dir (start: $(date '+%Y-%m-%d %H:%M:%S'))"
echo ""
# Счетчик найденных пар файлов
pairs=0
while IFS= read -r dir; do
base_files=$(find "$dir" -maxdepth 1 -type f -not -name "*table.*" -exec basename {} \; | sed 's/\.php$//' | sort)
table_files=$(find "$dir" -maxdepth 1 -type f -name "*table.php" -exec basename {} \; | sed 's/table\.php$//' | sort)
if [ -n "$base_files" ] && [ -n "$table_files" ]; then
for base in $base_files; do
base_file="$dir/${base}.php"
table_file="$dir/${base}table.php"
if [ -f "$base_file" ] && [ -f "$table_file" ]; then
# Проверяем наличие строки "class ***Table" в базовом файле
if grep -q "class.*Table" "$base_file"; then
echo "$base_file - есть"
echo "$table_file - есть"
else
echo "$base_file"
echo "$table_file"
fi
echo ""
((pairs++))
fi
done
fi
done < <(find "$search_dir" -type f -name "*table.*" -exec dirname {} \; | sort -u)
echo "Всего найдено пар файлов: $pairs"
Как пользоваться скриптом:
1. Логинимся на сервере по ssh, заходим в папку пользователя, например, cd /home/bitrix/.
2. Создаем файл с любым названием, например: touch find_doubles.sh.
3. Выдаем права на выполнение файла: chmod +x find_doubles.sh.
4. Запускаем скрипт, указав директорию для поиска: ./find_doubles.sh /home/bitrix/www/bitrix/modules/
После недолгой работы скрипт выведет ответ:
Файлы дублей выводятся по парам. Если в файле есть класс ***Table, то рядом с путём до файла пишется "есть класс". Проходим по всем файлам вручную и переименовываем дубликаты. Спустя много времени, ваш Битрикс начнет работать.
Что говорит техподдержка Битрикса (спустя 2 суток):
Такие пироги.