レジストリテーブルを再構築する方法?


9

registry他の問題のためにテーブルを切り詰めましたregistryが、データベースにリストされているファイルに基づいてテーブルを再構築するのに問題があります。

私はregistry_update()_registry_update()またはそれregistry_rebuild()を行うために電話しています:

drush eval "registry_rebuild();"

しかし、私は次のエラーを表示します:

致命的なエラー:クラス「SelectQueryExtender」が行15のinclude / pager.incに見つかりません

デフォルトでは(systemモジュールのインストール時)registryテーブルは空ですが、Drupalはどのようにして適切なデフォルトデータをそのテーブルに入力しますか?

回答:


15

それを行う最も簡単な方法は、モジュールを有効にすることです。もちろん、レジストリを再構築する必要がある場合、一般的に言えば、UIは使用できない場合がdrush en [modulename]ありますが、必要なすべての場合があります。

それで十分でない場合は、レジストリを再構築しますそれでもによりが簡単になります。それを行う最も簡単な方法は、drush拡張機能としてインストールすることです。

拡張機能をインストールし、を実行しdrush rrます。

モジュールのページには詳細なインストール手順が記載されており、必要に応じて、ドラッシュなしで実行する方法も示されています。


9

これは、Drupalを再インストールするか、Drupalの理想的なフレッシュインストールから壊れたインスタンスにテーブルをコピーすることで修正できます。

または、次の回避策を試すこともできます(Drupalインスタンスがすでに壊れている場合にのみ実行してください)。

  1. 最初に古いレジストリテーブルをバックアップします(念のため)。

    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;"
  2. ブートストラップキャッシュとレジストリテーブルをクリアします。

    drush sqlq "TRUNCATE cache_bootstrap; TRUNCATE registry"
  3. 基本データをレジストリテーブルに挿入します。

    drush sqlq 'INSERT INTO registry (name, type, filename) VALUES ("SelectQueryExtender", "class", "includes/database/select.inc"), ("DrupalDefaultEntityController", "class", "includes/entity.inc");'
    drush eval "registry_update();"
  4. キャッシュをクリアします。

    drush -y cc all
  5. 他のいくつかの欠落しているクラスのために、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から始まる手順を繰り返します。

  6. 何かが以前より壊れている場合は、次の方法でテーブルを元のポイントに復元できます(これは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の正規表現の助けに感謝します。


4
drush rr
thx-
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.