web-dev-qa-db-ja.com

データベーステーブルfile_usageのファイルデータはどのように作成および管理されますか?

孤立した画像ファイルをDrupal 7で削除していますが、最初に、画像を使用している可能性のある他のテーブルにそれらを相互参照する必要があります。IMCEエディターを介して画像をアップロードしないことを考えると、インターフェイスと主に画像モジュールを介してアップロードを行う場合、file_managedテーブルとimage_dimensionsテーブルをfile_usageに相互参照し、そこにないものを削除できると言っても安全でしょうか?

今私はただfile_usageがどのように入力されるのか疑問に思っています。ファイルタイプをアップロードするたびに入力されますか?

5

Drupalが一時ファイルを削除するために使用するコードは次のとおりです(cronタスク中に実行されます)。

  // Remove temporary files that are older than DRUPAL_MAXIMUM_TEMP_FILE_AGE.
  // Use separate placeholders for the status to avoid a bug in some versions
  // of PHP. See http://drupal.org/node/352956.
  $result = db_query('SELECT fid FROM {file_managed} WHERE status <> :permanent AND timestamp < :timestamp', array(
    ':permanent' => FILE_STATUS_PERMANENT,
    ':timestamp' => REQUEST_TIME - DRUPAL_MAXIMUM_TEMP_FILE_AGE,
  ));
  foreach ($result as $row) {
    if ($file = file_load($row->fid)) {
      $references = file_usage_list($file);
      if (empty($references)) {
        if (!file_delete($file)) {
          watchdog('file system', 'Could not delete temporary file "%path" during garbage collection', array('%path' => $file->uri), WATCHDOG_ERROR);
        }
      }
      else {
        watchdog('file system', 'Did not delete temporary file "%path" during garbage collection, because it is in use by the following modules: %modules.', array('%path' => $file->uri, '%modules' => implode(', ', array_keys($references))), WATCHDOG_INFO);
      }
    }
  }

file_usage_list() は、「file_usage」テーブルを照会する関数です。
そのテーブルに行を追加する関数は file_usage_add() ;です。それを呼び出す関数/フックを見ると、「file_usage」テーブルが管理対象ファイルに使用されていると結論付けます。 「file_managed」テーブルの行を含むファイルは削除しないので、「file_usage」テーブルを確認しないようにできます。

7
kiamlaluno

canonicalを行う方法は、画像を使用するときに使用マークを追加し、画像を使用しなくなったら削除することです。これは、3つの参照を持つ画像を意味し、1つの元のアップロードには4つの使用マークが付きます。何かがもう一度それを参照すると、5にバンプされます。参照されていないものがある場合、1つの使用法マークが消えます。そして、もし #managed_file のようなものでファイルをアップロードしただけなら、フォームが保存されるまで、ファイルは使用済みとしてマークされません。

file_delete() を呼び出す場合、使用カウントが0の場合のみDrupalはファイルを削除します-hddからファイル自体とテーブルからのすべてのメタデータの両方です。サイドが必要な場合は、必要なすべてのファイルをループするか、使用法を削除するたびに呼び出すことができます(通常の方法です)。

アイデアは、 file_usage_add()file_usage_delete() および file_usage_list() を介してのみ、そのテーブルと直接対話しないでください。また、実際のファイルやデータベースレコードは削除しないでください。まあ、コンテンツのセキュリティ問題などですぐに必要にならない限り。しかし、それ以外の場合は、Drupalが注意します。

4
Mołot