これは、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。のキャッシュのクリアが失敗した場合、次のいずれかを行うことができます。
a)不足しているクラスを手動で追加します。例:
$ 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.
または:
b)失敗したこれらのcontribモジュール(たとえば、profile2、ルール)を無効にしてみます。
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
テーブルの再構築は、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
Mikeの正規表現の助けに感謝します。
drush rr