13000ノードを削除


9

Drupal 7サイトで削除するノードが約13000あります。Views Bulk Operationsモジュールで一度に500ノードを削除しようとしましたが、タイムアウトしました。一度に削除できるノードは50までです。

一度に50を超えるノードを削除するにはどうすればよいですか?


以前は「一括削除」モジュールがありましたが、VBO anwyayを支持して時代遅れになりました。しかし、VBOはバッチ処理をサポートしているようです。使ってみましたか?
Mołot

1
以下の回答で示されているように、VBOはおそらく進むべき道です。この場合よりもはるかに多くのノードを削除する必要があるときに私がやったことは、必要のない多くのフックの呼び出しを無視するハックモジュールの呼び出しです。(私の最悪の犯罪者はapache solrでした)。これにより作業が大幅にスピードアップしますが、慎重に行う必要があります。
Letharion 2013年

回答:


16

VBOはノードを一括削除するためのデファクトスタンダードであり、それを行うためのより良い方法はありません。

VBOはバッチで処理するため、一度に1つ(またはおそらく2つ)のノードしか処理しません。したがって、タイムアウトエラーを受け取った場合、それらはバッチ操作全体ではなく、単一ノードの削除に関連しています。

このようなものに対する標準的な解決策は、補償するためにPHPの最大実行時間増やすことです。


2
答えを完成させるためだけに:操作のために取得する必要があるエンティティの数を選択できます。100を使用すると、私の経験から1分以内で問題ありません。
AyeshK 2013年

7

Develをインストールします。次に、D7のadmin / config / development / generate / contentに移動し、すべてのコンテンツタイプを選択します。「すべてのコンテンツを削除」にチェックを入れます。「ノードをいくつ生成しますか?」に0を入力します。

「生成」をクリックします。

すべてのノードが削除されます。


1
Mołot@「チェック『すべてのコンテンツを削除する』 ...」「は0を入力し、 『あなたが生成したいと思いますどのように多くのノード?』」 ...;)
クライヴ

@クライヴOK間違い、すみません。
Mołot

1
具体的には、これを行うのがDevel Generateモジュールです。Develに付属していますが、Develを有効にしただけではこの機能は利用できません。すべてを削除したくない場合は、この方法で特定のコンテンツタイプのすべてのノード簡単に削除することもできます。それでもPHPタイムアウトが発生し、CLIを恐れない場合は、Devel Generateに付属のDrush generate-contentgenc)コマンドを使用することもできます。drush help genc使用情報については。
Garrett Albright 2013年

3

VBOを使用して、Drushから実行します。スケールテスト後に150万を超えるノードを削除するには、次の方法を使用しました。

  1. ページで新しいビューを作成します。フィルターを適切に設定して、削除するノードのタイプのみを表示します。
  2. 新しいフィールドを追加:「一括操作:コンテンツ」
  3. [選択した一括操作]の[アイテムの削除]の横にあるチェックボックスをオンにします。
  4. ビューを保存します。
  5. Drushの使用方法を知っていると仮定して、次のコマンドを実行します(大きなデータセットに対して中断なしで実行するには、Linuxの「画面」を使用してください)。

drush vbo-execute my_view action :: views_bulk_operations_delete_item

ここで、my_viewはビューのマシン名です

また、drush vbo-listを使用して、使用可能なすべてのビューとその一括操作を表示することもできます。

VBOがシェルで実行され、フィードバックが提供されます。


2

そこにすべて削除モジュールがあります。サイトからすべてのノードやユーザーを削除します。

Drushもサポートしています。

例:

drush delete-all article             Delect all article nodes.  
drush delete-all all                 Delete nodes of all types.  
drush delete-all --reset             Delete nodes of all types, and reset node, revision and comment counters.  
drush delete-all users               Delete users.

7
このモジュールは使用しないことを強くお勧めします。スクリプトに時間制限を30秒に設定し、すべてのノードを個別に実行して呼び出しますnode_delete()(使用することさえありませんnode_delete_multiple())。さらに心配なことに、フィールドAPIを使用せず、フックを使用せずにデータベーステーブルから直接データを削除するオプションがあります。バッチジョブはまったくありません。スクリプトが終了するまで実行されます。非常に危険なモジュール私見。
クライブ

2
自分が何をしているのかがわかっていて、バックアップを取る場合は、まだ役に立ちます。すべてのフックとAPIを呼び出しながら数千のノードを削除すると、非常に遅くなる可能性があります。:(
Letharion 2013年

@Letharion苦痛も利益もありません;)もちろんですが、私はこのモジュールに免責事項を付けた方がいいでしょう。
クライブ

@Clive drushのサポートにより、drush delete-all article記事を削除できるようになった場合、私はこのソリューションに行きます。
AjitS 2013年

@develkar数百のノードでは問題ないかもしれませんが、drush拡張機能はオンサイトバージョンとまったく同じ機能を使用しているため、残念ながらタイムアウトの影響を受けます
Clive


0

あなたの場合のように大量のノードを削除する(つまり、一括)には、一括削除モジュールを使用することもできます。

これは、Batch APIを使用してノードを削除し、node_delete_multiple()への1回の呼び出しで数千のノードを削除するときのタイムアウトまたはメモリの問題を回避します。

これとは別に、コンテンツタイプのすべてのノードを削除するために[すべて削除]モジュールを試すこともできます。

お役に立てれば。


0

バッチAPIを使用してバッチプロセスを作成することもできます。そのバッチプロセスでは、

foreach($nodes as $node){ node_delete($node[nid]);}

それでおしまい。これで完了です。そのためのdrushコマンドを作成したい場合は、それを作成することもできます。参考のために見てくださいこの


0

コードでそれを行う理由がある場合:

$query = new EntityFieldQuery();

$query->entityCondition('entity_type', 'node')
  ->propertyOrderBy('nid', 'DESC')
  ->range(1000, 1000);

$result = $query->execute();
node_delete_multiple(array_keys($result['node']));

削除するノードを選択する方法は他にたくさんあります


0

Bobikのアドバイスを参考にして、ピンチの場合は「drush php-eval」の引数としてそれをフィードできますが、パフォーマンスはVBOのパフォーマンスに似ていると思われますが、少し高速です。パフォーマンスが本当に遅い場合は、「_ node_delete(」のコードベースをgreppingし、そのフックを使用している一部のモジュールを無効にできるかどうかを判断することによって、どのモジュールがhook_node_deleteを呼び出しているかを確認できます。

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