меню
- -
Дублирование файлов модулей после обновления Битрикс

Дублирование файлов модулей после обновления Битрикс

дублирование файлов модулей битрикс после обновления

Обычная задача по обновлению Битрикс24 обернулась бессонной ночью и кучей потраченных нервов.

502 ошибка после обновления

Первым делом надо подключаться к консоли и смотреть логи. В них видим ошибку:

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

Ошибка говорит о том, что класс с таким названием уже был объявлен и не может быть использован повторно. К сожалению, скрины сделал не связанные, но, думаю, суть вы уловите.

дублирубщиеся файлы iblock

Создалась целая куча дублей файлов таких как: 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 суток):

ответ техподдержки битрикса

Такие пироги.

Теги Битрикс24
Статья из подборки Битрикс24
Обсудим проект? Напиши в Телеграм или Whatsapp

Комментарии

Telegram
+
tg
Мы в Telegram Читай первым уникальный контент
+
Подпишись на наш Телеграм канал