web-dev-qa-db-ja.com

すべてのユーザーとユーザー1以外のコンテンツを削除します。

Drupalサードパーティによって作成されたサイトです。このサイトには多数のユーザー(〜13,000)がおり、ユーザーごとに多数のコンテンツアイテムが作成されています。

パフォーマンスを向上させるために、ユーザーとコンテンツからデータベースをクリーンアップしたいと考えています。ユーザーアカウントが作成されたIDを使用してユーザーがサイトにログインしようとすると、Webサービスが呼び出され、正しいコンテンツが再作成されます。私の次の仕事は、データを今後も制御可能に保つためのcronタスクを作成することです。

ユーザーID 1を除くすべてのユーザーを削除する方法が必要です。VBOを確認しましたが、ときどき実行が停止し、もう一度開始する必要があります(完了していません)。

以下を呼び出すdrushコマンドを作成しました。

function delete_users_batch_delete() {
  drush_print('Deleting Users');
  $uids = delete_users_get_uids();
  $count = count($uids);

  $temp = 0;
  foreach ($uids as $uid) {
    $temp++;
    user_delete($uid);
    if ($temp % 25 == 0) {
      drush_print('deleted ' . $temp . ' from ' . $count);
    }
  }
  drush_print('All users deleted');
}

function delete_users_get_uids() {
  $result = db_query('SELECT u.uid FROM {users} u WHERE u.uid > 1');
  $uids = $result->fetchCol();
  return $uids;
}

しかし、これは私のローカルマシンで非常に遅く実行されています。すべてをすばやく削除する最良の方法は何でしょうか。

私が自分でプロジェクトを開始した場合、インストールスクリプトを実行するだけで、正しく構成されたサイトの新しいインスタンスがセットアップされます。残念なことに、これはなく、大きなデータベースダンプが1つだけあります。

4
Johnny

Views Bulk Operations(VBO) module ...を使用できます。

上記のモジュールでは、ノード、ユーザー、コメントに対して一括操作を実行できます。また、Batch APIを使用して、選択した操作をすべてのノード、ユーザー、またはコメントに適用することもできます。バッチAPIを使用すると、フォーム処理を複数のページリクエストに分散できるため、PHPタイムアウトが原因で処理が中断されないようにすると同時に、ユーザーが進捗状況に関するフィードバックを受け取ることができます進行中の操作。

ビューのVBOオプションには、すべてのユーザーのすべてのアイテムを選択し、管理者の選択を解除するすべて選択ボタンを有効にする設定があります。

5
Anil Sagar

これを行うには、DevelのDevel Generateサブモジュールを使用します。 Generate usersに移動し、生成するユーザーの数を0に設定し、Delete all users(except user id 1)before new usersオプションにチェックマークを付けて、 生成ボタン。

2
Scorchio

素晴らしい Devel モジュールのサブモジュールである_devel_generate_モジュールを使用すると、Drushを使用してそれを行うこともできます。

事前にDBをバックアップしてください;)

すべてのコンテンツを削除します。

_drush genc --kill 0 0
_

すべての記事を削除します。

_drush genc --kill --types=article 0 0
_

Uid 1を除くすべてのユーザーを削除します。

_drush genu --kill 0
_

_--kill_を含むgenuの場合、これはクエリのハードコーディングされた条件です:->condition('uid', 1, '>')はuid 1を削除しません。

1
leymannx

大量削除のためだけの ser_delete_multiple(array $ uids) 関数があります。したがって、自分でループしないでください、Drupalでループさせます。

複数のユーザーアカウントを削除します。

パラメーター

  • $ uids:ユーザーIDの配列。

フックの呼び出しのためにループする必要があるため、muchより速くない可能性があることに注意してください。

また、1 [3000]エントリの配列は->condition('uid', $uids, 'IN')呼び出しには少し大きくなる可能性があります。構成に応じて、ある種のバッチ処理を使用して、リスト全体をチャンクごとに100から1000ユーザーに分割することをお勧めします(計算は難しく、テストが簡単です)。

1
Mołot