Это можно исправить либо переустановкой Drupal, либо копированием таблицы из идеально новой установки Drupal в ваш сломанный экземпляр.
Или вы можете попробовать следующий обходной путь (делать это только тогда, когда ваш экземпляр Drupal уже сломан):
Сначала сделайте резервную копию старой таблицы реестра (на всякий случай):
drush sqlq "CREATE TABLE registry_bak LIKE registry; INSERT INTO registry_bak SELECT * FROM registry;"
drush sqlq "CREATE TABLE system_bak LIKE system; INSERT INTO system_bak SELECT * FROM system;"
Очистите загрузочный кеш и таблицу реестра.
drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
Вставьте основные данные в таблицу реестра:
drush sqlq 'INSERT INTO registry (name, type, filename) VALUES ("SelectQueryExtender", "class", "includes/database/select.inc"), ("DrupalDefaultEntityController", "class", "includes/entity.inc");'
drush eval "registry_update();"
Очистить кеши:
drush -y cc all
Если очистить кеши в 4. не удалось, из-за некоторых других отсутствующих классов вы можете:
а) Добавьте недостающие классы вручную, например:
$ drush -y cc all
Fatal error: Class 'Entity' not found in profile2.module on line 593
$ grep -Rwl "^class Entity" .
./sites/all/modules/entity/includes/entity.inc
$ drush sqlq 'INSERT INTO registry (name, type, filename) VALUES ("Entity", "class", "sites/all/modules/entity/includes/entity.inc");'
$ drush -y cc all # testing...
# If Fatal error:, repeat 5a. again.
или:
б) Попробуйте отключить эти неисправные модули contrib (например, profile2, rules):
drush sqlq 'UPDATE system SET status = 0 WHERE name = "failing_module"'
и повторите шаги, начиная с 4.
Если что-то сломано больше, чем было, вы можете восстановить ваши таблицы до первоначальной точки (что было сделано в шаге 1.):
drush sqlq "TRUNCATE registry; INSERT INTO registry SELECT * FROM registry_bak;"
drush sqlq "TRUNCATE system; INSERT INTO system SELECT * FROM system_bak;"
и попробуй еще раз.
См. Также: Как переместить установленные модули из / sites / all / modules / * в / sites / all / contrib / modules / *
Восстановление registryтаблицы также может быть достигнуто с помощью следующего скрипта, запущенного в web-корне Drupal:
grep -ERo "^(\s+)?(abstract )?class (\S+)" . | tr ':' ' ' | sed "s/abstract //g" | awk '{print "INSERT INTO registry (filename, type, name) VALUES (\x27"$1"\x27,\x27"$2"\x27,\x27"$3"\x27);"}' | $(drush sql-connect) -f
Благодаря помощи Майка с регулярным выражением.
drush rrне удалось